Jak zabezpieczyć formularz przed spamem?
Wiele stron internetowych niepotrzebnie stosuje w formularzach kontaktowych ochronę typu captcha. Jeśli nie mamy dużej strony i nie bombardują nas setki czy tysiące e-maili dziennie od użytkowników to wystarczy nam odpowiednie filtrowanie e-maili oraz małe sztuczki, przez które nie przechodzi większość robotów spamujących.
Ochrona formularzy sprowadza się przede wszystkim na przechytrzeniu spambotów, które atakują naszą stronę. Ktoś napisał taki skrypt - spambot, który szuka formularzy i w odpowiedni sposób automatycznie wypełnia pola i go wysyła. To wcale nie jest takie proste bo wiele formularzy posiada walidację. Czyli w odpowiednie pole trzeba wpisać poprawny adres e-mail, w pozycji telefonu mogą być tylko liczby, myślniki i spacje. Jeśli pole, w którym trzeba wprowadzić adres e-mail nazwiemy name="email" to ułatwiamy sprawę ataku bo wskazujemy co i jak ma być wypełnione. Dlatego starajmy się nazywać pola tak by nie sugerowały w łatwy sposób co ono zawiera. Formularze kontaktowe przeważnie posiadają kilka pól więc nie powinniśmy się pogubić w nazewnictwie.
Wracając do walidacji, spambot nie jest w stanie wykryć, które pola są obowiązkowe i muszą zostać wypełnione, dlatego stara się wypełnić wszystkie. Dzięki temu jesteśmy w stanie zrealizować bardzo prostą sztuczkę, która polega na utworzeniu pola <input />, które ukryjemy poprzez css czy javascript. Dodatkowo wprowadźmy w nazwie słowo zawierające 'email', np. 'funnyemail' (nie dajemy samego 'email' bo może ktoś stosować autouzupełnianie formularzy).
Niestety programiści pracujący nad spamowaniem formularzy wiedzą o takich elementach i mogę np. w przypadku nie wysłania formularza spróbować pozostawić pierwsze pole puste, albo sprawdzać po kolei, które pole mogą zostawić puste.
Innym sposobem zabezpieczenia formularzy jest użycie javascript. Dodajemy do formularza ukryte pole, które po wciśnięciu guzika wysłania formularza, a przed jego rzeczywistym wysłaniem uzupełnia pole o odpowiednią wartość. Spamboty niestety nie potrafią jeszcze w większości przypadków korzystać z javascript więc formularz zwróci błąd.
Po co tak w ogóle spamboty wysyłają nasze formularze? Przeważnie chcą się reklamować na naszych stronach, wysyłając przy tym linki do swoich stron. Jeśli już uda się wysyłać formularz jakiemuś robotowi zawsze zostaje nam ostatnia deska ratunku. Możemy sprawdzić co zostało wysłane w polu opisowym.
Jeśli wysyłany formularz służy do kontaktu to na pewno nie powinien zawierać bbcode, a roboty spamujące często wysyłają [url=tutaj-jakiś-adres]. Wystarczy zrobić walidację.
Można także z upływem czasu przygotować sobie listę słów, które często występują w wiadomościach spamowych, a także listę adresów IP, które notorycznie próbują nam coś wysłać.
Słowa kluczowe: Bezpieczeństwo, antyspam, formularz, spam, zabezpieczenie, artykuł, blog

Komentarze i opinie
Sam często używam tricku z ukrytym polem - niestety, zaproponowane przez Ciebie rozwiązanie z JS może także karać użytkowników, którzy JS nie używają.
W części przypadków stosuję dodatkowy trick, pozwalający na oszukanie bota - ukryte pole + zmyłka w odpowiedzi. Jeżeli skrypt stwierdzi, że wypełniono pole, które powinno zostać puste, wpis nie zostaje dodany do bazy, ale zostaje on wyświetlony na stronie wynikowej - w ten sposób bot skanujący odpowiedź z serwera uważa, że wszystko poszło ok i idzie sobie spamować gdzie indziej.
I taka mała uwaga - po co używać preg_match, jeżeli nie szukasz wyrażeniem regularnym? Dużo szybciej strstr.
@BTM: każdy kto nie używa javascript zdaje sobie sprawę, że część stron może mu nie zapewniać pełnej funkcjonalności, nie możemy ograniczać się przy budowaniu stron bo ktoś ma jakieś widzi mi się i wyłącza javascript ;) ( przeglądarki tekstowe proponuje zostawić w spokoju )
co do zmyłkowej odpowiedzi, osobiście wolę dostawać zawsze poprawne odpowiedzi bo jak nam coś nie wyjdzie to łatwiej wtedy wyłapywać ewentualne problemy, a nie zastanawiać się czemu formularz został wysłany, a my nie mamy wpisu w bazie ;)
strstr jest szybsze zdecydowanie, ale to nie ma zupełnie znaczenia w tego typu rozwiązaniach, nie popadajmy w skrajności ;)
Metoda z ukrytym polem jest dobra, ale nie zawsze skuteczna. Filtrowanie tagów podnosi skuteczność do poziomu bliskiego 100% - w moim przypadku tak to wygląda (na moim blogu nadal wersja nieidealna).
Co do JS - niezbyt dobre rozwiązanie.
Brak JS to nie tylko przeglądarki tekstowe. Wiadomo, że nie będziemy dokładać pracy i symulować wszystkiego dla użytkowników bez JS, bo to już nie te czasy. Ale obsługa formularzy to podstawa raczej w obsłudze strony i takie coś powinno bezproblemowo działać bez JS - można obcinać wygodę użytkowania (jakieś ajaxy i inne), ale nie można sprawiać, że użytkownik będzie poświęcał czas, aby potem dowiedzieć się, że autor strony i tak domyślnie go olał.
A projekt Sblam http://sblam.com/ ? Nie używałem jeszcze, ale opis jest interesujący.
@takieGadanie: wygląda na Polską odpowiedź na [Askimet](http://eb.venti.com.pl/fmslider/)], który w przypadku blogów WordPress sprawdzał się bardzo pozytywnie
Dzięki. Muszę wykorzystać na swojej stronie, bo właśnie miałem z tym problem.
Ja na swojej stronie stosuję mały skrypt, który sprawdza obecność takich słów, które często występują w komentarzach oznaczonych przeze mnie jako spam. Działa bezbłędnie. Dziennie zatrzymuje około 20-30 takich komentarzy. Czasem się jakiś przedostanie, ale to się zdarza rzadko.
Uproszczoną wersję takiego skryptu można obejrzeć w jednym z moich tutoriali na stronie.
Z ostatnim sposobem, bywa różnie... Niektórzy specjalnie umożliwiają wykorzystywanie bb-code, aby nie użytkownik, nieumyślnie nie popsuł strony np. nie domkniętym znacznikiem (ale to w komentarzach bardziej)
Ja osobiście częściej korzystam z dwóch innych metod. Jeśli chodzi o formularz do wysłania wiadomości to najlepiej wtedy pobrać czas wyświetlenia strony wraz z czasem próby wysłania treści i jeżeli dany czas będzie np. krótszy niż 3 sekundy to można potraktować jako spam, bo roboty spamujące wysyłają treść od razu, a człowiek co jak co, ale musi troszkę czasu poświęcić, aby napisać jakąś treść.
Troszkę na ten temat napisałem na początku roku tutaj: http://free.xaa.pl/anty-captcha-inne-sposoby-zabezpieczania-przed-botami
"dodatkowy trick, pozwalający na oszukanie bota - ukryte pole + zmyłka w odpowiedzi. Jeżeli skrypt stwierdzi, że wypełniono pole, które powinno zostać puste, wpis nie zostaje dodany do bazy, ale zostaje on wyświetlony na stronie wynikowej - w ten sposób bot skanujący odpowiedź z serwera uważa, że wszystko poszło ok" BTM:
i "spamuje" dalej zżerając cały transfer...
Można zabezpieczyć form polem w które należy wpisać słowo z polskimi znakami np: przepisz słowo ćma > pole formularza. Roboty nie potrafią używać polskiej czcionki.
Można też dać pole z byle jakim pytaniem np. Jaki jest adres tej strony. Nazwę pola dać email i pole jako obowiązkowe, Sambot już nic nie zdziała.
Dzięki za informację!
Rozwiązania zaoferowane są ciekawe. Zawsze jednak zastanawiałem się nad monitorowaniem zachowania użytkownika w obrębie formularza - czy można to jakoś zbadać? Jasnym jest, że człowiek wpisując komentarz traci czas, nie uderza w klawisze równomiernie. Ba zapewne bot robi to w sekundę. Czy ktoś z was zastanawiał się nad badaniem takich elementów?
Ciekawe rozwiazanie sprawy z tym czasem wpisywania slow.
Tylko pamietaj, ze na kazde zabezpieczenie jest sposob.
To tez mozna obejsc...
Nowy komentarz