Alternatywna metoda zabezpieczenia przed spamem

Chciałbym przedstawić sposób, którego ostatnio zacząłem używać w swoich projektach i który do tej pory nie przepuścił mi żadnego spamu. Sposób jest bardzo prosty, z innym podejściem od popularnych dzisiaj mechanizmów typu CAPTCHA, takich jak przepisywanie (czasem nawet zgadywanie) znaków z obrazka czy dodawanie prostych liczb.
Nie opiera się na skomplikowanych algorytmach ani nawet nie wymaga od użytkownika udowadniania tego, że jest rzeczywiście człowiekiem, a nie botem szukającym swojej kolejnej ofiary. Bardzo szybko się go implementuje, a łatwość z jaką to przychodzi pozwoli na zastosowanie nawet przez początkujących webdeveloperów.
Z pewnością poradnik, jaki prezentuję, nie jest żadną nowością czy czymś oryginalnym, ale osobiście nie spotkałem się jeszcze z żadną publikacją pokazującą tę konkretną formę, ani w języku angielskim, ani polskim. Nie przypisuję sobie autorstwa, ponieważ to nie ja to wymyśliłem, z pewnością też nie wpadł na to znajomy, który mi o tym powiedział.
Nie przedłużając, najpierw opiszę sposób działania, a następnie pokażę przykład w postaci kodu w języku PHP.
Sposób z ukrytym polem formularza
Aby uprościć formę przekazu, przyjmijmy, że projektujemy bloga. Oczywiście, jak to na bloga przystało, istnieje możliwość komentowania wpisów. Aby zabezpieczyć się przed niechcianymi wiadomościami wprowadzamy do formularza dodatkowe, ukryte pole, którego wartość przyjmuje uniksowy znacznik czasu, ustalany za pomocą funkcji time().
Nie zdarzy się raczej przypadek, w którym osoba napisze i wyśle komentarz w czasie krótszym niż 5 sekund. Przy takim założeniu, podczas walidacji formularza sprawdzamy, ile czasu minęło od wyświetlenia strony, tzn. od aktualnego znacznika czasu odejmujemy wartość ukrytego pola formularza i od razu porównując, czy wynosi to więcej niż 5 sekund. Jeżeli ten warunek nie zostanie spełniony, przerywamy skrypt i pokazujemy botowi pocztówkę z pozdrowienia od administratora serwisu, w innym przypadku kontynuujemy wykonywanie skryptu i dodajemy komentarz.
Uwaga! Zarówno kod HTML, jak i PHP służą jedynie do demonstracji przykładu i nie odwzorowują poprawnie napisanych skryptów.
Kod HTML
<form action="http://example.com/" method="post">
Autor: <input type="text" name="author" />
Treść: <textarea name="content" rows="10" cols="35"></textarea>
<input type="hidden" name="viewtime" value="<?php echo time(); ?>" />
<input type="submit" name="submit" value="Skomentuj!" />
</form>
Kod PHP
if (time()-$viewtime <= 5) { echo 'Kartka z pozdrowieniami dla spambotów.'; } else { # Dodajemy komentarz i np. przekierowujemy na stronę ze wpisem }
Wykorzystanie sesji
Jeżeli w swoim projekcie używamy np. sesji, to możemy je bardzo łatwo wykorzystać. Rezygnując z dodatkowego pola w formularzu, możemy dodać znacznik czasu do tablicy z sesją.
if (!empty($_POST['author']) && !empty($_POST['content'])) { if (time()-$_SESSION['viewtime'] <= 5) { echo 'Kartka z pozdrowieniami dla spambotów.'; } else { # Dodajemy komentarz i np. przekierowujemy na stronę ze wpisem } } else { # W tym miejscu wyświetlamy formularz już bez ukrytego pola, a następnie dodajemy do tablicy sesji aktualny znacznik czasu $_SESSION['viewtime'] = time(); }
Zachęcam do testowania rozwiązania, a także dzielenia się swoimi alternatywnymi metodami, które odnoszą sukcesy. Chętnie przyjmę krytykę i wytłumaczenie, co i dlaczego robię źlę, jeśli tak rzeczywiście jest.
foto: mulad
Napisane 31 sierpnia 2008 o 19:23:00
W kategorii
Ogólne
|
Programowanie
|
Techblog
|
Web
| 31 komentarzy »
Ale czemu zakładasz, że nie napiszę komentarza w ciągu 5 s? :) Przecież za pierwszym razem ok – muszę notkę przeczytać, jednak jeśli później tylko odpowiadam, to od razu przesuwam na dół i piszę choćby komentarz „ok” – zajmie mi to mniej czasu…chyba :-).
Nigdy nie spotkałem się z komentarzami o treści „ok”. Niemniej jednak, 5 sekund to jest naprawdę krótko, spróbuj sobie. Zawsze można obniżyć czas do, powiedzmy, dwóch czy trzech sekund. Poniżej raczej nie zejdziesz, a bota i tak załapie. :)
Świetny pomysł, przyznaje:)
http://ablam.com/ AFAIR ma to, i mase innych sztuczek… a boty pewnie mozna ustawic na wieksze zrownoleglenie przetwarzania, i >5s wyjdzie…
Ewentualnie mozna kazac mu odczekać te 5s chociaz jak nasz bot ma wykonywać tysiące wtedy akcji będzie to ogromna strata czasu;)
joru: Na pewno podałeś dobry adres?
@Walker, na pewno chodziło mu o „Sblam!„http://sblam.com
Edit: Goddamn Textile…
Z tego co słyszałem, zdecydowana większość spambotów już się nauczyła, że trzeba wysyłać formularze z kilkusekundowym opóźnieniem, więc tym sposobem niewiele się osiągnie.
Poza tym spambot może wstawić w ukryte pole własny czas, odpowiednio wcześniejszy, i wtedy nawet czekać nie musi. Oczywiście tak inteligentnych botów jeszcze nie ma, ale lepiej dmuchać na zimne – czyli czas zapisać w bazie, a w ukrytym polu wstawić token powiązany z tym czasem.
A tak nawiasem mówiąc – dodaj tabindex do pola na treść komentarza, bo o mały włos wysłałbym pusty.
Cichy: nawet gdyby boty by się tego nauczyły, a nie sądzę, żeby tak było, to można szyfrować czas. Możliwości z wykorzystaniem tego są setki, sam właśnie taki podałeś. :)
faktycznie o http://sblam.com/ mi chodzilo :/
Pierwszy raz to zobaczyłem, ale po przejrzeniu stwierdziłem, że to nie jest to, co mnie zadowoli. A głównym argumentem jest to, że zależy od czegoś innego. Niemniej jednak ciekawy projekt, przejrzę w wolnym czasie, dzięki. Szkoda tylko, że nie ma opisanych metod działania.
http://sblam.com/techniki.html ?
Ja niedawno wykupiłem abonament na stronie na templatesbox.com na trzy miesiące. Szablonów do ściągnięcia jest 700 i chyba nie będę ich ręcznie ściągał – to napisałem bota, który CURL’em chodził i ściągał je po kolei. Ustawiłem opóźnienie między kolejnymi stronami na 7 sekund. Skoro ja wpadłem na coś takiego, to twórcy masowych spambotów chyba tym bardziej?
Wykorzystując sesję należy być świadomym, iż użytkownik może tuż przed wysłaniem komentarza otworzyć w nowym oknie kolejną podstronę naszego serwisu.
Warto też zdawać sobię sprawę, iż następujący scenariusz jest możliwy: Użytkownik wchodzi na stronę, czyta artykuł, pisze komentarz (co zajmuje mu nawet i pół godziny) po czym kopiuje jego treść do schowka, odświeża stronę, aby sprawdzić, czy nikt w międzyczasie nie dodał własnego wpisu i gdy odkrywa, iż nic takiego nie zaszło wkleja swoją wpowiedź i wysyła.
Rzecz jasna nie dyskredytuje to tej metody — można wszak wyświetlić niewinny komunikat, iż z powodów technicznych prosimy o poczekanie parunastu sekund i ponowienie wysłania komentarza.
mina86: Dobra uwaga!
Rozwiązanie takie idealne nie jest – ja czasami pisze komentarz, kopiuje treść, odświeżam stronę i sprawdzam czy ktoś nie był szybszy ode mnie (aby nie powielać niepotrzebnie odpowiedzi), a następnie szybko wklejam i wysyłam.
Adriano: Tak, jak już pisałem, da się to obejść. Choćby nawet przez zmniejszenie właśnie czasu do 2-3 sekund.
Dominik: Dzięki, widać niedostatecznie przyjrzałem się stronie.
Patrzę na te wszystkie techniki bronienia się przed spamem z podziwem (bardzo podoba mi się przytoczona przez Ciebie Walker opcja) i trochę ze smutkiem. Przygnębiające, że ludzie muszą wpadać na coraz to oryginalniejsze pomysły, żeby uchronić się przed niechcianą pocztą.
Ciekawe, czy kiedyś dane nam będzie ujrzeć system, który likwiduje spam w 100% ;).
Z pewnością nie, w końcu spamują też ludzie.
ok
Jesli dobrze zrozumiałem, to ta metodą powstrzyma jedynie bota przed floodowaniem.
Ogólnie bota, nie musi floodować i tak jest za szybki. :)
ok
http://blog.eldoras.com/2007/11/25/skuteczna-user-friendly-captcha/
Boty sa za madre na hidden – wiedza, ze to pole nalezy traktowac „specjalnie” i mi przestal ten trick dzialac. Lepiej to ukrywac CSSem obecnie. Imho.
Ale co boty robią z hidden?
Próbują tam zostawić treść lub użyć pustej lub kombinacji znaków np. „spam”.
No właśnie, więc w takim wypadku mój sposób działa dalej. :)
Obejście pola „hidden” przez boty musiało nastąpić, pora na nowsze triki anty-spam.
A tak ogólnie szukam metody zablokowania znaczników html/php w treści formularza.
Popieram sposób z ukrytym polem komentarza. Sprawdza się w 100%.
Szkoda tylko, że Jogger nie daje możliwości wywalenia kodu CAPTCHA i zastąpieniu go własnym rozwiązaniem.
eeee