Posledních 25 let jsem nějak bez múzy a nevím o čem psát ale nedávno jsem v souvislosti se spuštěním komentářů na webu dostal nápad na sepsání malého seriálu o ochraně komentářů před spamem. Někdo by snad mohl podotknout, že nejlepší obrana je umožnit vkládat komentáře pouze přihlášeným uživatelům nebo komentáře úplně zakázat.
Jenže moje situace je jiná. Můj web není nijak výrazně navštěvovaný a jeho obsah nijak úžasný a nutit uživateli registraci je za těchto okolností poněkud mimo mísu. Zároveň bych ale rád nabídl možnost reagovat na má ublognutí (čímž padá zákaz komentářů) těm několika málo lidem, kteří sem zavítají.
Vkládání komentářů se skládá ze dvou částí – formuláře a scriptu, který zpracuje data formulářem odeslaná. Máme tedy obecný komentářový formulář, který obsahuje vstupní pole „jmeno“, „email“, „web“, „zprava“ a jedno skryté pole „clanek“, které slouží k identifikaci článku.

První možnost jak odlišit robota od člověka, je vložení skrytého vstupu. Do formuláře přidáme nové textové pole a pojmenujeme jej například „e-mail“. Výsledek bude vypadat třeba takhle:
Ano, pole nebude typu hidden ale normální text. Skryjeme jej pomocí stylu, proto jsme mu také přiřadili třídu. Můžeme samozřejmě použít přímo style ale to je příliš nápadné a zbytečně tím usnadníme práci potenciálnímu spammerovi. Do našeho souboru se styly tedy vložíme následující:
input.email { display: none; }
Uživatel toto pole v prohlížeči neuvidí, tudíž jej ani nebude vyplňovat a to je náš záměr. Predpokladem je, že jeho prohlížec pracuje se styly. Pokud nikoliv, polícko bude viditelné ale prístupy z techto prohlížecu nepredpokládáme a tak se ošetrením nebudeme zabývat.
Uživatel tedy polícko nevidí a ponechá je prázdné. Robot jej naopak vidí, protože ten nepracuje na bázi vizuální ale se zdrojovým kódem v nemž hledá formuláre a povedomá vstupní pole. Z tohoto duvodu je naše polícko pojmenované „e-mail“. Robot jej najde, vyhodnotí jako pole pro vložení e-mailové adresy a tudíž jej odešle vyplnené. Je sice fakt, že spousta robotu jen sebere vstupní pole, nacpe do nich náhodné množství hnoje a odešle je ke zpracování ale vhodným pojmenováním zvyšujeme šanci že se robutek nachytá.
Script, který se nám stará o zpracování dat z odeslaného formuláre, by mohl vypadat nejak takto:
<?php if ( empty($_POST['e-mail']) ) { // pole je prazdne, muzeme komentar ulozit } else { // pole obsahuje nejakou hodnotu, zadne ukladani nebude } ?>
Tím jsme ucinili první krok jak zabránit robotum ve spamování. Ačkoliv se jedná o opravdu primitivní ochranu, je vcelku účinná. Ve fázi zjištení robota je rozhodne vhodné si uložit IP adresu ze které přišel požadavek na vložení komentáře, stejne jako hodnotu user_agent. Získané informace pak mužeme nadále zpracovat, napríklad proti ruzným seznamum robotu nebo zjistit komu patrí IP adresa a prípadne ji zablokovat (zablokování IP rozsahu cínského providera nám asi príliš vadit nebude).