Jak ograniczyć dostęp do strony dla złośliwych botów i spamerów?

Rosnący w zaskakującym tempie zużyty transfer na serwerze mimo małego ruchu użytkowników na stronie, błędy połączeń z bazą danych wywołane dużą ilością połączeń na sekundę, czy też po prostu brak odpowiedzi serwera lub nietypowo wolno działająca strona, zazwyczaj spowodowane są dużym ruchem botów sieciowych wszelkiej maści – i tych dobrych, czyli np nasz kochany wujek google oraz i tych złych, czyli wszelkiego rodzaju tałatajstwa indeksującego strony z naszego punktu widzenia całkowicie niepotrzebnie, np boty wyszukiwarek w językach, których nasza strona nie obsługuje, czy też boty szukające maili, danych prywatnych, czy np luk w zabezpieczeniach serwera. Jak z tym walczyć ? Metod jest kilka, najskuteczniejsze, znane mi metody, przedstawiam poniżej.

Jedną z kluczowych metod blokowania niechcianych botów na stronie jest odpowiedni wpis w .htaccess – dla mniej zorientowanych, to plik w katalogu, gdzie znajdują się nasze pliki ze stroną, lub w katalogu nadrzędnym, który służy do konfiguracji niektórych usług serwera apache. Dzięki odpowiednim zapisom w owym pliku w prosty sposób możemy np blokować dostęp do danego katalogu, blokować IP, określać przekierowania adresów, czy np sterować wybranymi funkcjami parsera PHP. W tym przypadku wykorzystamy funkcję oczywiście blokowania niechcianych adresów. A wygląda to mniej więcej tak:

Filozofii nie ma tu wcale, j.w. w sekcji files blokujemy bociki po IP, natomiast w wierszach z przedrostkiem SetEnvIfNoCase User-Agent boty po nazwie. Po całej sekcji koniecznie należy dopisać 3 linie (order allow…), jak w przykładzie. Lista spambotów zaczerpnięta z tegoż blogu z małym uzupełnieniem o dodatkowe linie. Źródło IP’ków to tym razem forum PIO. Dodatkowo pojwił się zapis Deny from all, co zabezpiecza sam plik konfiguracyjny przed dostępem z zewnątrz.

Dla prawdziwych antyglobalistów powstała też strona countryipblocks.net, gdzie można wygenerować sobie automatycznie wpisy np do .htaccess, dzięki którym zablokujemy całe kraje, polecam np Chiny i Rosję, chociaż osobiście nic do nich nie mam ;) Minus tego tylko taki, że nasz plik konfiguracyjny nieco urośnie, w związku z tym wzrośnie wykorzystanie ramu na serwerze. Aby tego uniknąć, najlepiej blokować główne klasy IP, tak jak w przykładzie wyżej.

Inna metoda blokowania w .htaccess w przykładzie poniżej:

Gdzie w cudzysłowie podajemy boty po nazwie lub po fragmencie nazwy lub po IP lub klasie IP. Powyższy przykład blokuje nieco tałatajstwa ze Wschodu ;)

Jeśli posiadamy dostęp do PHP na serwerku, możemy również wykorzystać instrukcje programowe zapisane w treści plików strony napisanej właśnie w PHP. Aby globalnie coś zablokować na www, wystarczy na początku w kodzie, uwzględniając oczywiście sesje, pakowanie, itp, dodać np to:

To jeden z wielu sposobów, innym jest np przekierowanie danego IP na stronę błędu, albo na zupełnie inne IP. Kombinacji jest wiele :)

Ciekawym też rozwiązaniem, jest skrypt PHP exaDB, który rozpoznaje szybkość przeglądania strony. Jeśli jest to bot spoza zaufanej listy, który przegląda nienaturalnie szybko podstrony, blokuje jego IP. Implementacja na stronie jest bardzo prosta, a sam skrypt z instrukcją dostępny jest na google docs

Owe rozwiązanie stosuje na 2 dość ruchliwych domenach i w efekcie, transfer spadł o kilkadziesiąt procent, przy realnym wzroście użytkowników. Sporadycznie jednak występuje problem, jeśli ktoś otwiera bardzo szybko podstrony w zakładkach, zostaje uznany przez skrypt jako bot. Blokada na szczęście jest okresowa.

Kolejnym, popularnym rozwiązaniem jest odpowiedni wpis w pliku robots.txt, którego lokalizacja jest jak w przypadku .htaccess. Z tym, że skuteczność tej metody bywa różna, nie każdy bot czyta owy plik i nie każdy się do jego reguł stosuje. Ale dobre i kilka % wywalić niepotrzebnego ruchu :) Ot przykładowa zawartość:

W przykładzie j.w. blokujemy m.in. rosyjski yandex i google-image. Ten drugi googlowy, w przypadku galerii, jest jednak jak najbardziej wskazany, w przypadku np katalogu – nie koniecznie :)

Możemy do tematu podejść od d*** strony, to znaczy nie blokować tylko poszczególnych botów sieciowych, a reszcie zezwalać, tylko zezwolić na dostęp do strony wybranym „dobrym”, a całą resztę spambotów blokować. Taka metoda ponosi jednak za sobą pewne zagrożenie, mianowicie istnieje prawdopodobieństwo, że nowo powstałe boty indeksujące, które działają na rzecz strony, zostaną również zablokowane. Przykład poniżej dopuszcza do strony tylko boty google indeksujące treść pod wyszukiwarkę i ads:

Więcej o tym, jak blokować wszystkie boty (o skuteczności tej metody pisałem już wyżej), poza wybranymi np od google za pomocą pliku robots.txt na google webmasters tools. Znak * naturalnie oznacza dowolny znak, ciąg znaków, w tym wypadku to dowolna nazwa bota/usera.

Innym rozwiązaniem jest też zastosowanie firewall. Zalecane zwłaszcza wtedy, gdy wymięka .htaccess, chcemy blokować bardzo dużą ilość IP, monitorować dokładnie ruch, wykluczać, zezwalać, itp. Szerzej opiszę to być może, jak się z tym dokładniej zapoznam, a zapoznam się, jak mi żona pozwoli na to czasowo ;)

Tak, czy siak, nie ma idealnej metody blokowania „wszystkich” botów, które atakują nasze strony, aczkolwiek istnieje wiele sposobów, by w dość radykalny sposób ograniczyć ich ruch na serwerze, a tym samym zaoszczędzić sporo kasy na nie zużytym transferze.

Jak coś jeszcze ciekawego znajdę na ten temat, to dodam :)