Oma chat-järjestelmä ja lomakepohjat – tekninen projektikuvaus
Yleiskuva
Tämä projekti kuvaa omaa, kevyttä chat- ja lomakealustaa, jota käytän useilla sivustoillani (mm. it-huoltomies.fi ja nousiainen.eu:n eri alasivut). Ratkaisun tavoitteena on:
- tarjota yksinkertainen ja selkeä tapa ottaa yhteyttä ilman ulkoisia chat-palveluja
- säilyttää viestit hallitusti omassa tietokannassa (SQLite)
- varmistaa hyvä perustietoturva (CSRF-suojaus, validointi, lokitus)
- mahdollistaa jatkokehitys (statukset, raportointi, admin-paneeli) ilman raskasta frameworkia
Arkkitehtuuri
Kokonaisuus on toteutettu kevyenä PHP + SQLite -ratkaisuna. Peruskuvio:
Selain (asiakas) → chat JS / lomake → PHP-endpoint (chat-send.php / contact.php) → SQLite-tietokanta → admin-näkymä
- Julkinen kerros: HTML/CSS/JS, jossa on chat-ikkuna ja/tai lomake (yhteydenotto, palaute, raporttipohja).
-
PHP-kerros: erilliset skriptit viestien ja lomakelähetysten käsittelyyn
(
chat-send.php,chat-fetch.php,contact.phpjne.). - Tietokantakerros: SQLite-tietokanta omassa hakemistossaan, johon on rajattu pääsy (.htaccess, filepermissionit).
- Admin-kerros: erillinen admin-näkymä, josta voi selata viestejä, merkitä käsitellyiksi ja tarvittaessa hakea raportteja.
Tietokantarakenne (chat)
Chat-järjestelmä käyttää yksinkertaista SQLite-tietokantaa, jossa viestit talletetaan omaan tauluunsa. Tyypillinen rakenne:
id– juokseva pääavainconversation_id– chat-keskustelun tunnistesender_type– esim.client/adminname– asiakkaan nimi (jos annettu)message– varsinainen viestisisältöcreated_at– aikaleima (UTC / palvelimen aika)ip_hash– IP-osoitteesta tehty tiiviste (esim. auditointia varten tietosuoja huomioiden)status– esim.new,in_progress,done
SQLite valittiin, koska se riittää hyvin yhden sivuston chat-käyttöön, on helppo backupata ja toimii hyvin myös edullisella shared hosting -ympäristöllä.
Lomakepohjat (yhteydenotto, raportit, palautteet)
Chat-järjestelmän rinnalla käytän samaa periaatetta myös perinteisissä lomakkeissa (mm. it-huoltomies.fi-yhteydenottolomake, raportti- ja palautelomakkeet). Tyypillinen rakenne:
- HTML-lomake (nimi, sähköposti, kuvaus, valinnainen liite)
- CSRF-token piilokentässä, joka tarkistetaan palvelimella
- honeypot-kenttä bottien suodattamiseen
- serveripään validointi (pakolliset kentät, pituusrajat, sallittujen merkkien tarkistus)
- lomakelähetyksen lokitus erilliseen lokitiedostoon (aikaleima, IP-hash, onnistuminen / virhe)
Osa lomakkeista lähettää lisäksi sähköpostin (esim. it-huoltomies-keikat), mutta tieto tallentuu aina myös lokiin tai tietokantaan mahdollista jälkikäteen tarkastelua varten.
Tietoturva ja validointi
Chat- ja lomakeratkaisuissa on panostettu perusasioihin, jotka puuttuvat yllättävän monesta “nopea PHP-lomake” -toteutuksesta.
- CSRF-suojaus: jokaisella lomakkeella ja chat-pyynnöllä on CSRF-token, joka tarkistetaan serveripäässä ennen datan käsittelyä.
- Syötteiden validointi ja normalisointi: viestit ja lomakesyötteet trimmaataan, rajoitetaan pituudeltaan ja tarkistetaan, ettei kenttiin päädy selvästi haitallista sisältöä.
- Header injection -suojaus: sähköposteissa käytetään erillistä helper-funktiota, joka poistaa otsikkokentistä rivinvaihdot ja muut riskimerkit, jotta header injection -hyökkäykset estetään.
- Honeypot ja aikarajat: lomakkeissa on piilokenttä sekä mahdollinen aikaleimatarkistus, joiden avulla yksinkertaiset botit karsiutuvat pois.
- Virheilmoitukset: tuotantoympäristössä virheilmoitukset eivät vuoda polkuja tai SQL-virheilauseita asiakkaalle, vaan yksityiskohtainen tieto menee lokiin.
Lokitus ja audit trail
Chat- ja lomakeviestit ovat osa asiakaspalveluprosessia, joten ratkaisuissa on huomioitu myös jäljitettävyys.
- Jokaisesta viestistä tallentuu aikaleima, lähettäjän nimi (jos annettu) ja tiivistetty IP.
- Virhetilanteet (esim. epäonnistunut tietokantakirjoitus tai sähköposti) kirjataan erilliseen lokiin.
- Admin-näkymässä voidaan tarkastella käsittelemättömiä viestejä, merkitä ne käsitellyiksi ja tarvittaessa hakea historiatietoja.
- Lokit sijaitsevat ei-julkisissa hakemistoissa ja niihin on rajattu pääsy (tiedosto-oikeudet, .htaccess, X-Robots-Tag: noindex).
Admin-näkymä ja jatkokehitys
Admin-näkymä on toteutettu kevyenä PHP-sivuna, jossa:
- listataan uudet ja käsitellyt viestit selkeänä taulukkona
- näytetään viestin sisältö, aikaleima ja mahdollinen status
- on mahdollisuus muuttaa viestin tilaa (esim. “uusi” → “käsitelty”)
- on suojatut sisäänkirjautumissivut (peruskäyttäjätunnus + salasana, rajattu näkyvyys)
Jatkokehityksenä admin-näkymä on helppo laajentaa esimerkiksi:
- statistiikkaan (viestimäärät per päivä / viikko, vastaukseen kulunut aika)
- integraatioon muihin työkaluihin (esim. sähköposti- / tehtävälistaintegraatio)
- Telegram- tai muun ilmoituskanavan lisäämiseen uusista viesteistä
Yhteys it-huoltomies.fi-toteutukseen
it-huoltomies.fi on ensimmäisiä sivustoja, jossa tämä chat- ja lomakepohja on otettu käyttöön tuotantomielessä. Samat periaatteet näkyvät siellä:
- CSRF-suojatut lomakkeet (yhteydenotto, raporttipohjat)
- selkokielinen käyttöliittymä, ei ylimääräistä hälyä tai häiritsevää “popup”-chatia
- lokitus ja audit trail ongelmatilanteiden selvittämistä varten
- data säilyy omalla palvelimella, ei kolmannen osapuolen chat-pilvessä
Teknisellä tasolla it-huoltomies.fi hyödyntää samoja PHP-apufunktioita,
tietoturvakäytäntöjä (mm. header-sanitointi, noindex teknisille sivuille) ja
hakemistorakennetta (erilliset includes/, logs/ ja
data/ -kansiot), jotka on kuvattu tällä sivulla.
Johtopäätökset
Oma chat-järjestelmä ja lomakepohjat osoittavat, että kevyellä PHP + SQLite -ratkaisulla voidaan rakentaa hallittu, turvallinen ja laajennettava viestintäkerros ilman ulkoisia palveluja. Ratkaisu on helposti siirrettävissä sivustolta toiselle, ja se skaalautuu hyvin yksittäisen mikroyrittäjän tai pienen organisaation tarpeisiin.
Keskeinen oppi on, että perusasioiden (CSRF, validointi, lokitus, hakemistorakenteet) huolellinen tekeminen on usein tärkeämpää kuin teknologiapino – ja sama pohja toimii sekä yhteydenottolomakkeissa että reaaliaikaisessa chat-käytössä.