Jak zabezpieczyć bloga przed spamem

Zabezpieczenie formularza przed spamem to niełatwe zadanie. Trzeba mieć na uwadze pewną równowagę między bezpieczeństwem a upierdliwością. Poniżej kilka moich spostrzeżeń i własne rekomendacje.

Kapeć

Captcha, kapcia, czy też kapeć (każdy chyba ma swoją wersję) to najbardziej upierdliwy sposób powstrzymywania spamu. Boty I tak go często umieją obejść, a prawdziwi użytkownicy muszą wpisywać jakieś nieczytelne kody, nieraz myląc się i z trudem odcyfrowując krzaczki na obrazku.

Kapci jest sporo — jedne zadają pytanie matematyczne, inne wyświetlają obrazek, jeszcze inne stosują ASCII-art (Figlet) lub prezentują kilka zdjęć i proszą o wybranie tych, które przedstawiają kotki albo pieski. Jedne są bardziej czytelne, inne mniej, jeszcze inne przeładowuję po kilkanaście razy zanim trafię na wersję, którą w ogóle będę w stanie odcyfrować. Wszystkie mają wspólną wadę: wymagają od użytkownika dodatkowego wysiłku, jakiejś interakcji.

Ukryty kapeć

Swego czasu wziąłem się za utrzymywanie modułu dla Drupala 7 zwanego Hidden Captcha. Działanie jest banalnie proste: do formularza dołączane jest dodatkowe pole, ale jest ukrywane za pomocą arkusza CSS. Dla zwykłego użytkownika jest niewidoczne. Robot prawdopodobnie nie sprawdza szablonów CSS i zauważy oraz zapewne wypełni dodatkowe pole, zwłaszcza jeśli jego nazwa będzie do tego zachęcała („url”, czy „website” to chyba łakome kąski dla robotów — w końcu zależy im właśnie na skierowaniu nas na jakąś stronę internetową).

Podczas walidacji formularza pole jest uznawane za błędne jeśli ma jakąś wartość. Celem jest właśnie wysłanie pustego pola formularza.

Problemem jest fakt, że nie każdy robot upiera się przy wypełnianiu wszystkich pól formularza. Już nieraz spotkałem się z sytuacją, gdy roboty nie dawały się złapać na taką przynętę i zostawiały podstawione pole puste.

Jeszcze jeden ukryty kapeć

Tę wersję ukrytego kapcia wymyśliłem podczas czytania pewnego wpisu na blogu (niestety, teraz juz nie pamiętam adresu — jak ktoś znajdzie, to będę wdzięczny za podanie linka). W oryginalnym poście zamiast ukrywania podstawionego pola za pomocą CSS, dodatkowe pole było dodawane za pomocą JavaScriptu. Polem był odznaczony checkbox, z etykietką „nie jestem robotem”. Jedyną interakcją ze strony użytkownika było kliknięcie checkboxa. Podczas walidacji sprawdzana była wartość dodatkowego pola — jeśli została przesłana, to formularz nie był uznawany za spam.

Ja zmodyfikowałem tę wersję i zamiast checkboxa, zdecydowałem się dostawić pole typu hidden. Walidacja formularza polegała na sprawdzeniu, czy owo dodatkowe pole było obecne, a jego wartość pusta — w przeciwnym razie post był oznaczany jako spam.

Można również przygotować inne pochodne tego pomysłu, np. za pomocą JavaScriptu dostawić przycisk wysyłki formularza. Na tej stronie można znaleźć jeszcze inną modyfikację: formularz od początku zawiera ukryte pole o pewnej nazwie, a JavaScript zamienia jego nazwę lub wartość na inną.

Wszystkie te zabiegi mają jedną wspólną wadę: użytkownik bez obsługi JavaScript nie wyśle żadnego zabezpieczonego w ten sposób formularza.

AJAX

Formularze komentarzy na mojej stronie są zabezpieczone w jeszcze inny sposób. Korzystając z faktu, że roboty zazwyczaj nie wykonują JavaScriptu zawartego na stronie, formularz jest doładowywany asynchronicznie. Jeśli nie wierzysz, otwórz konsolę JavaScript, przeładuj tę stronę i zobacz, czy nie pojawi się tam dodatkowe żądanie :).

Minusem tej metody jest, tak jak i w poprzednim przypadku, konieczność włączenia JavaScriptu, aby w ogóle zobaczyc formularz. Plusem za to jest fakt, że serwer w ogóle nie musi użerać się z żadnymi podejrzanymi postami, nie musi nic analizować. Jeśli doszedł jakiś komentarz (nie licząc sytuacji, kiedy formularz jest spreparowany), to najprawdopodobniej dlatego, że został on doładowany AJAXem, co samo w sobie daje dużą dozę pewności, że to nie robot.

Analiza nagłówków

Kolejnym ciekawym podejściem jest to, które stosuje Bad Behaviour, czyli plugin, którego przez wiele lat używałem na swoim starym blogu. Chodzi tu o analizę nagłówków wiadomości. Spamboty najczęściej wysyłają nagłówki w pewien sposób umożliwiające identyfikację spamu: brak referera, brak nagłówka Accept, IP znajdujące się na czarnej liście, czy też user agent podszywający się pod jakąś wyszukiwarkę lub robota indeksującego stronę (z doświadczenia: najczęściej pod Googlebota).

Analiza zawartości komentarza

Chyba najwolniejszym sposobem jest analiza zawartości komentarza. Filtr bajezjański jest często stosowany przy analizowaniu przychodzących e-maili, ale można go również wykorzystać do analizy komentarzy na stronie. Filtr wymaga ręcznego oznaczania wiadomości jako spam. Analizuje następnie zawarte w nich wyrazy i do każdej następnej wiadomości, czy komentarza, stosuje prawdopodobieństwo statystyczne: jeśli komentarz zawiera często powtarzające się w spamie słowo, to zapewne też jest spamem.

Można oczywiście ręcznie definiować automatyczne odrzucanie wiadomości, np. jeśli komentarz zawiera słowo „cialis”, to można go spokojnie oznaczyć jako spam.

Kolejnym kryterium może być absolutna liczba linków zawartych w komentarzu, ewentualnie stosunek liczby linków do łącznej długości komentarza. Linki można również sprawdzać, np. za pomocą serwisu SURBL.

Inne metody

Jeśli znasz inną, ciekawą metodę zabezpieczania się przez spamem, chętnie się z nią zapoznam. Zostaw komentarz (pamiętaj o JavaScripcie) albo wyślij mi maila!


Komentarze

Jan

2012-10-26, 18:51

Witam, ja stosuje metodę php sesji

Dominik Marczuk

2012-10-26, 19:07

A rozwiniesz temat? Na czym dokładnie polega metoda? Może mi tym podsuniesz materiał na kolejny post o walce z mielonką ;)

Wojciech

2014-08-21, 21:56

Piszę tylko duże serwisy, dlategoteż musza być one dobrze zabezpieczone.
zabawne, skoro więksość botów nie przeszukuje kodów javascript warto umiescic kod html w kodzie javascript za pomocą document.write ?,
albo po wejsciu na podstrone z folmularzem wygenerować ciasteczko/sesję w której generowały by się nazwy zmiennych form (2 musiały by być puste - niewidoczne dla użytkownika zmieszane z folmularzem) ale w sesji/ciasteczku z były zapisane które to, następnie sprawdzić wszystko przez folmularz php - jeśli ukryte są wypełnione - brawo mamy bota. Można też zrobić opcją 3 zmienne nazwać np alt1 alt2 alt3 alt4 np alt1 i alt2 były ukrytymi polami które musiały by być puste - bot ktoreś z nich musiałby wypełnić. Zawsze można zrobić wiecej takich póll.

Ostatnio testowałem to na jednej stronie (około 100 000 userów) złapały się tylko 2 boty. Myślę że właściciel bloga zrobi z moich technik dobry użytek. Pozdrawiam - chętnie pomogę dron.programmer@gmail.com

jasiek94

2014-10-30, 19:13

Ja osobiście na swoim blogu używam kodu do przepisania i oprócz tego jeszcze moderuje wszystkie wypowiedzi. Owszem jest to wkurzające jak jest dużo komentarzy do sprawdzenia, ale przynajmniej mam pewność że nie ma spamu.Pozdrawiam

Maciek

2017-03-19, 07:27

Pytam bo nie wiem - czy brak włączonego JS jest teraz problemem? W sensie jak wielu go wyłącza?

Dominik

2017-04-28, 02:18

Nie wiem, jak wielu go wyłącza. Różne źródła podają różne liczby, od jakiegoś pomijalnie małęgo odsetka nawet do 5%. A czy to problem? Kwestia podejścia :)


Napisz komentarz


Szukaj wpisów


Chmura tagów