⚈ Kuopassa.net

Lisää kertomuksia netistä. 摆烂

Spämmiltä suojautuminen PHP:n avulla koodatulla sivustolla

Ensimmäiseksi haluan muistuttaa, etten ole koodari vaikka osaan koodata jonkin verran. Tässä on sellaisia seikkoja, jotka olen todennut tehokkaiksi konsteiksi vähentää roskapostin pääsemistä läpi esimerkiksi PHP:n avulla koodatun sivuston palautelomakkeen, kommentointilomakkeen tai rekisteröitymislomakkeen kautta. Esimerkiksi Pelitpelit.net-sivustolla voi kommentoida pelisivua. Sivuja on noin 3600 kappaletta ja jokaisella niistä on oma kommentointilomakkeensa. On siis tuhansia sivuja, joista käsin roskapostia voi päästä ruudulle. PHP-pohjaisten suojausmenetelmien lisäksi edellä mainittu sivusto hyödyntää .htaccess-tiedoston sisälle lisättyjä vehkeitä. Kirjoitan tässä kuitenkin lähinnä PHP:hen liittyviä asioita.

HTML & kenttien nimeäminen

Lomakkeen HTML-merkkauksessa suosittelen käyttämään mahdollisimman paljon suomenkielisiä attribuuttien arvoja. Esimerkiksi jos lomakkeessa on oma yksirivinen tekstikenttänsä sähköpostiosoitetta varten, sitä ei kannata nimetä tyyliin name="email", koska tuo taatusti vetää kuin hunajapurkki ikään kaikenlaisia skeidansuoltajia. Sen sijaan mailiosoitteen kentän nimeksi voi olla fiksumpaa antaa esimerkiksi name="sahkopostiosoite" tai jotain abstraktimpaa, mutta koodin ymmärtämisen vuoksi minä tykkään nimitellä asioita suomen kielellä.

HTML & kenttien enimmäispituus

HTML-puolen kohdalla lomakkeeseen voi lisätä myös maxlength-attribuutin ja rajoittaa sillä alkeellisimpia roskapostitusyrityksiä. Tällaisen merkkimäärän enimmäispituuden asettavan arvon voi liittää yksirivisiin tekstikenttiin. Sitä ei voi siis käyttää monirivisessä tekstikentässä eikä pudotusvalikoissa tms. tai lomakkeen lähetysnappuloissa. Jos lomakkeessa kysellään vaikkapa postinumeroa, on helppo päättää miten monta merkkiä kentässä saa enintään olla. Samaan tapaan jos kysellään puhelinnumeroa, voidaan ainakin päätellä, että siinä kentässä merkkimäärän rajoitukseksi voi laittaa vaikka 20, eli: maxlength="20".

PHP & enimmäis- ja vähimmäispituudet

Varsinaisia PHP-niksejä suojata nettisivulla oleva lomake spämmiltä kerron tästä kappaleesta alkaen. :-) Suosittelen ensimmäiseksi miettimään mitä tietoja lomakkeella käyttäjän odotetaan lähettävän. Jos lomakkeella on tarkoitus lähettää nimimerkki, sähköpostiosoite ja jokin pitkähkö viesti, voidaan näiden tietojen pohjalta miettiä miten systeemi kannattaa koodata. Jokaisen kentän merkkimäärän pituus on tietenkin yksi huomioitava asia. Esimerkiksi sähköpostiosoite harvemmin on satojen merkkien mittainen, sama koskee nimimerkkiä. Viestikentän merkkimääräkin kannattanee rajoittaa ettei valtavan pitkiä merkkilitanioita voi lähettää. Enimmäispituuksien lisäksi vähimmäispituuksillekin kannattaa antaa huomiota. Sähköpostiosoite ei voi olla tyyliin neljä merkkiä pitkä eikä välttämättä ole järkevää antaa käyttäjän lähettää viestiä, jonka merkkimäärän pituus on vain muutama merkki. Merkki-sana tuntuu toistuvan usein… Nimimerkki saattaa jossain pelisivuston kommentointilomakkeessa olla hyvinkin lyhyt, mutta ehkä senkin vähimmäispituudeksi voisi laittaa vähintään kaksi merkkiä.

PHP & lähetettävän tiedon tyyppi

Pituuksien lisäksi kenttien kautta lähetettävän tiedon tyyppi on noteeraamisen arvoinen. Jos lomakkeessa on sähköpostiosoitteelle varattu kenttä ja siihen on pakko kirjoittaa jotain, voidaan estää lomakkeen tietojen lähettäminen jos mailikentässä on pelkkiä numeroita tai jos siinä on erikoismerkkejä, tai sellaisia merkkejä joita ei sähköpostiosoitteessa voi käyttää — ääkköset mukaan lukien. Tätä ideaa voi hyödyntää muissakin kohdissa. Sähköpostiosoitteen voi lisäksi validoida ja niin myös monet muut kenttätyypit. Jopa lomakkeen lähetysnappulan kohdalle voi lisätä jonkun tunnisteen, joka tsekataan ja selvitetään onko se kelvollinen, jotta lomakkeen tiedot lähetetään.

PHP & erikoisempia keinoja

Mitäs muuta? Lomakkeen sisällä voi kuljettaa piilotettua tietoa vaikkapa niin, että lomakkeen HTML-merkkauksen sisältä löytyy type="hidden" jonkin kentän kohdalla. Siihen voi lisätä vaikkapa lähettäjän IP-osoitteen tai sen sivun osoitteen, josta lomake on lähetetty. Tällöin jos lomakkeen lähettäjän IP-osoite saadaan selville, sitä voidaan verrata johonkin blokattujen osoitteiden listaan. Jos lomakkeen mukana tulee tieto siitä, mistä URL-osoitteesta lomake on lähetetty, sitäkin tietoa voidaan hyödyntää eri tavoin. Esimerkiksi jos sitä tietoa ei ole lainkaan mukana, voidaan laittaa varoituskellot soimaan. Toki monimutkaisempiakin järjestelyitä voidaan tuollaisen tiedon avulla saada selville yhdistelemällä eri tietoja: jos sama IP-osoite on lähettänyt samalta sivulta kommentin vasta hetki sitten, voidaan estää uuden viestin lähettäminen joksikin aikaa. Tuollainen cooldown voi tehdä roskapostin jättämisen hankalammaksi.

PHP & lisää erikoisempia keinoja

Jokseenkin työläämpi homma on käyttää jotakin epäilyttävien sanojen luetteloa tai kokoelmaa tuhmista sanoista, joita lomakkeen kentissä ei saa ilmetä. Textpattern-sivustoilla kommenttispämmiä yritetään hillitä mm. esikatselutoiminnolla. Jos esikatseluvaihetta ei ole käyty läpi, kommentin julkaiseminen on hankalaa. Joillain sivustoilla käytetään CAPTCHA-tunnistusta tai turvakysymyksiä. Ne, kuten esikatselutoimintokin, tekevät kuitenkin lomakkeen tietojen lähettämisestä työläämpää kuin aikaisemmin mainittujen taustalla toimivien ja huomaamattomien suojausten käyttäminen.

Lopuksi

Tässä asiat on esitetty siinä järjestyksessä kun ne tulivat mieleeni. Kirjoituksessa on varmaan jäänyt jotain tärkeää käsittelemättä. Lukisinkin mielelläni muiden ajatuksia erilaisista keinoista suojata nettisivujen lomakkeita bittimaailman villiviikareilta.

Tietoa kirjoittajasta