Skocz do zawartości

Skrypt chroniący zasoby serwera przed złośliwymi botami


exa

Sonda  

43 użytkowników zagłosowało

  1. 1. Użyteczność skryptu

    • Tak, przetestuję
      15
    • Przetestowałbym, ale nie wiem jak go zainstalować
      6
    • Nie do końca rozumiem czy jest mi to potrzebne
      3
    • Nie potrzebuje takich zabezpieczeń
      3


Rekomendowane odpowiedzi

Witam,

postanowiłem opublikować skrypt, który napisałem jakiś czas temu w sytuacji, kiedy złośliwe boty zaczęły atakować jedną ze stron będących pod moją opieką. Strony w sieci (pomimo, że tego niekiedy nie widać) nękają śmieciowe boty szukające luk z skryptach czy też będące amatorskimi zbieraczami treści, które często zarzynają nasze konta (przeglądnijcie access logi serwera). Skrypt ten w momencie wykrycia, że strony nie przegląda człowiek a bot (przy tym za szybko przechodzi po naszej stronie) czasowo blokuje mu dostęp chroniąc tym samym zasoby naszego konta. Boty Google, Yahoo i MSN nie są ograniczane.

Zapraszam do testowania. Możliwe, że zasoby z Waszych stron w większości zjadane są przez złośliwe boty (często problem dotyczy wordpressów i popularnych forów). Tu przykład problemu: https://www.forum.optymalizacja.com/index.p...396&hl=http.

Skrypt na licencji GPL + opis dostępny jest na mojej stronie: https://www.web6.pl/exaBotDefender/.

Skrypt chroniący zasoby serwera przed atakami botów exaBotDefender: https://docs.google.com/View?id=dgkd4pj4_0hfj5j4gx

Odnośnik do komentarza
Udostępnij na innych stronach

  • Odpowiedzi 35
  • Dodano
  • Ostatniej odpowiedzi

Ja tam co prawda stosuje rozwiązania jako moduł apache, ale nie zawsze da sie go zastosować wiec będe pamietał o Twoim rozwiązaniu (jak napisze w Twoim watku to na pewno odnajdę :D )

Jestem ciekawy tylko jak to jest ze sprawdzaniem istnienia pliku w katalogach, czy przy powiedzmy milionie katalogów będzie widać różnicę w czasie wykonanie sie skryptu . Bo jednak plik trzeba odnaleźć na dysku. Co sadzisz o takim problemie ?

Odnośnik do komentarza
Udostępnij na innych stronach

Jestem ciekawy tylko jak to jest ze sprawdzaniem istnienia pliku w katalogach, czy przy powiedzmy milionie katalogów będzie widać różnicę w czasie wykonanie sie skryptu . Bo jednak plik trzeba odnaleźć na dysku. Co sadzisz o takim problemie ?

Katalogów jest 10. Pliki o nazwie = IP lądują tam po funkcji (abs(ip2long($_SERVER['REMOTE_ADDR'])) % 10 + 1) (+1, żeby nikt się nie zakręcił z numerowaniem katalogów od 0). Katalogi czyszczone są automatycznie raz na 24 godziny przez skrypt.

I teraz ile masz unikalnych wejść na dobę? Przy 2000 ilość plików rozłoży się na 200/katalog. Przy 10000 UO/24h możesz sobie utworzyć dowolną ilość katalogów i wyedytować w skrypcie 2 linijki:

$bd_subdir = (abs(ip2long($_SERVER['REMOTE_ADDR']))%10 + 1) . '/';

.

for($i = 1; $i <= 10; $i++){

Powinienem tą dziesiątkę wyciągnąć do jakiejś zmiennej, ale w sumie wiadomo o co chodzi.

Mogłem skrypt tak stworzyć, żeby sam w razie potrzeby utworzył dodatkowe podkatalogi, ale to działało by tylko przy safe_mode = Off. Tak czy inaczej łatwo można sobie skrypt przeskalować.

Skrypt chroniący zasoby serwera przed atakami botów exaBotDefender: https://docs.google.com/View?id=dgkd4pj4_0hfj5j4gx

Odnośnik do komentarza
Udostępnij na innych stronach

Już widzę , to czego wczoraj nie widziałem , czyli co znaczy % :)

Ok czyli jest 10 katalogów i pliki sa tworzone a raz dziennie wszystkie kasowane.

Ale zastanawiam sie jak to jest w systemie operacyjnym z plikami , bo w linux katalog jest plikiem specialnym do ktorego zapisywane sa nazwy plików, kasowanie plików nie odzyskuje miejsca z tego pliku specjalnego (katalogu) dlatego tez przy liniowym przeszukiwaniu im więcej się plików skasuje tym będzie wolniej :) (Chyba?)

Dla przykładu mój katalog /var/virusmails ma 7MB (choć skasuje wszystkie pliki z niego)

Oczywiście są to rozważania czysto teoretyczne

Ewentualnie mozna to poprzeć przykładem takim:

Skrypt do testowania szybkości file_exists:

$dir = "testDir";
for($i=0;$i<100;$i++)
{

 $f1= microtime(true);

 if (file_exists($dir ."/". rand(1,100000) ))
 {
 }

 $f2= microtime(true);

echo $f2-$f1 ."\n";
}

Skrypt do generowania plików

$dir = "testDir";
for($i=0;$i<100000;$i++)
{
 $handle = fopen($dir."/".$i, "w");
 fwrite($handle,$i);
 fclose($handle);
 echo $i."\n";

}

Najpierw sprawdzamy czasy na nowo utworzonym katalogu potem generujemy 100k plików i kasujemy te pliki a dopiero potem testujemy jeszcze raz szybkość

Odnośnik do komentarza
Udostępnij na innych stronach

Już widzę , to czego wczoraj nie widziałem , czyli co znaczy % :)

To znak modulo, reszta z dzielenia.

Ale zastanawiam sie jak to jest w systemie operacyjnym z plikami , bo w linux katalog jest plikiem specialnym do ktorego zapisywane sa nazwy plików, kasowanie plików nie odzyskuje miejsca z tego pliku specjalnego (katalogu) dlatego tez przy liniowym przeszukiwaniu im więcej się plików skasuje tym będzie wolniej :) (Chyba?)

Nie, system plików jest jak w każdym normalnym systemie. Usunięcie pliku zwalnia miejsce :-). Nic nie spowolni po 24 godzinach. Do FAQ dopisałem, że skrypt jest tak skonstruowany, że ma praktycznie zerowy narzut zarówno na operacje plikowe jak i czas działania. Serwer nie odczuje w ogóle jego obecności.

Dla przykładu mój katalog /var/virusmails ma 7MB (choć skasuje wszystkie pliki z niego)

Coś musiałeś pomieszać. Jak sprawdzasz rozmiar pliku? Pewnie wewnątrz są pliku ukryte (zaczynające się od kropki).

Co do tych pętli, to nigdy nie będzie u mnie nawet 1000 plików w folderze. Do tego u mnie są to plik 23 bajtowe, a linux świetnie radzi sobie z cache takich plików.

OK, dodałem ankietę, bo wydawało mi się, że więcej osób się tym zainteresuje. Na stronie opisałem instalację exaBotDefendera pod najpopularniejszymi skryptami.

Skrypt chroniący zasoby serwera przed atakami botów exaBotDefender: https://docs.google.com/View?id=dgkd4pj4_0hfj5j4gx

Odnośnik do komentarza
Udostępnij na innych stronach

Testy (ze 100 tysiącem plików) wykazują że ilość plików w katalogu nie ma znaczenia na czas dostępu do pliku, co wydaje mi sie trochę dziwne. Może za mało plików albo odczyt z katalogów jest w jakiś sposób buforowany bo pierwszy odczyt katalogu jest o rząd wielkości wolniejszy od całej reszty odczytów z katalogu.

Wielkość katalogu sprawdzam tak: du -m NAZWA KATALOGU

Plików ukrytych brak :) , przez wielkość katalogu rozumiem w tym przypadku ilość miejsca zajmowaną przez plik specjalny typu "katalog" a nie pliki w katalogu.

Skoro działa i ile bym plików nie wygenerował i nie zwalnia to znaczy że w sumie nie ma nawet potrzeby dzielić na katalogi bo wszystko można upchnąć w jeden i jest tak samo szybko. W sumie to do takiego stwierdzenia chciałem dojść :)

Odnośnik do komentarza
Udostępnij na innych stronach

Wielkość katalogu sprawdzam tak: du -m NAZWA KATALOGU

Plików ukrytych brak :) , przez wielkość katalogu rozumiem w tym przypadku ilość miejsca zajmowaną przez plik specjalny typu "katalog" a nie pliki w katalogu.

To źle sprawdzasz, bo -m oznacza megabajt i zaokrągla przy wyświetlaniu rozmiar każdego pliku w katalogu do góry (przynajmniej 1).

~/public_html/vps/web6.pl/exaBotDefender;> du -hs bdsave/
44K	 bdsave/
~/public_html/vps/web6.pl/exaBotDefender;> dd if=/dev/zero of=bdsave/1/test bs=1024 count=10000
10000+0 przeczytanych recordów
10000+0 zapisanych recordów
skopiowane 10240000 bajtów (10 MB), 0,137164 sekund, 74,7 MB/s
~/public_html/vps/web6.pl/exaBotDefender;> du -hs bdsave/
9,9M	bdsave/
~/public_html/vps/web6.pl/exaBotDefender;> rm bdsave/1/test 
~/public_html/vps/web6.pl/exaBotDefender;> du -hs bdsave/
44K	 bdsave/
~/public_html/vps/web6.pl/exaBotDefender;>

Puste katalogi to 44 KB, bo każdy wpis katalogu to 4 KB (10 podkatalogów + katalog).

Skoro działa i ile bym plików nie wygenerował i nie zwalnia to znaczy że w sumie nie ma nawet potrzeby dzielić na katalogi bo wszystko można upchnąć w jeden i jest tak samo szybko. W sumie to do takiego stwierdzenia chciałem dojść :)

To nie jest prawdą. Dostęp do ostatnio używanych plików w Linuksie jest buforowany i jest to jak widzisz robione niesamowicie sprawnie. Bufor ma jednak ograniczone rozmiary (jak pracujesz na localhoscie to nawet przy dziesiątkach tysięcy plików tego nie zauważysz) i dlatego w jednym katalogu raczej nie powinno być więcej niż 1000 plików. Wszystko zależy od serwera, na którym pracujemy.

[edyta]

Heh, szkoda, że zrobił się offtop.

Dodałem kod dla Scuttle.

Skrypt chroniący zasoby serwera przed atakami botów exaBotDefender: https://docs.google.com/View?id=dgkd4pj4_0hfj5j4gx

Odnośnik do komentarza
Udostępnij na innych stronach

Kiepskie rozwiązanie, bo blokuje również dostęp zwykłemu userwowi który otwiera sobie strony w zakładkach.

Notabene kiedyś myślałem podobnie, ale Kolega Kaviorek "otworzył mi oczy" i opracowałem w miarę elegancki sposób jak to obejść https://www.forum.optymalizacja.com/index.php?showtopic=56314

HTTP 200 usługi IT -> Dariusz Janicki | Realizacja serwisów www oraz oprogramowania w PHP / C# / Golang / Node.js / MySQL/ Laravel
Komory normobaryczne - normobaria.tech Wykonawca montażu i instalacji komory normobarii

Odnośnik do komentarza
Udostępnij na innych stronach

Chyba jednak się nie przyglądnąłeś uważnie ;).

ja jak wpadam na serwis informacyjny to najpierw otwieram w zakładkach to co mnie interesuje, 1-2 na sekundę pewnie to jest, a później czytam...
Jak widać nie przewidziałem takiej ewentualności :)

Mój skrypt nie blokuje użytkowników otwierających zakładki. Sam potrafię wejść na forum i otworzyć ich na stracie 10-15. W dużym uproszczeniu skrypt zbiera dane do 30 sekund. Jeżeli w ciągu 30 sekund przekroczysz limit (domyślnie 25 wywołań strony) dostajesz czasową blokadę. Poza tym to nie jest koncepcja a rozwiązanie, które stosuje już od roku i którym chciałem się podzielić :).

Skrypt chroniący zasoby serwera przed atakami botów exaBotDefender: https://docs.google.com/View?id=dgkd4pj4_0hfj5j4gx

Odnośnik do komentarza
Udostępnij na innych stronach

To źle sprawdzasz, bo -m oznacza megabajt i zaokrągla przy wyświetlaniu rozmiar każdego pliku w katalogu do góry (przynajmniej 1).

Sprawdzam dobrze ;) co mi za różnica czy 7MB czy 8MB chodzi o idee , dałem parametr -m świadomie aby pokazać że pusty katalog może mieć spore rozmiary.

Zrób tak:

mkdir test; ls -la;

x=1;
while [ $x -le 1000000 ]; do
touch test/$x
rm test/$x
x=$[x + 1]
done

ls -la;

katalog na poczatku miał 4kb po skończeniu kilka MB choć pliku w nim nie będzie :)

Odnośnik do komentarza
Udostępnij na innych stronach

Mój skrypt nie blokuje użytkowników otwierających zakładki.
Otwieram sobie jako user kilka stron w zakładkach z linku na twojej stronie demo w FF i mam "exaBotDefender. I mam Dostęp do strony został zablokowany na 3 minuty."->. Więc co w tym momencie robi?

HTTP 200 usługi IT -> Dariusz Janicki | Realizacja serwisów www oraz oprogramowania w PHP / C# / Golang / Node.js / MySQL/ Laravel
Komory normobaryczne - normobaria.tech Wykonawca montażu i instalacji komory normobarii

Odnośnik do komentarza
Udostępnij na innych stronach

Przy linku do strony testowej napisałem ...blokuje dostęp na 3 minuty w przypadku przekroczenia 5 wywołań w ciągu 30 sekund. To jest strona testowa z celowo obniżoną tolerancją otwartych właśnie po to, żeby zobaczyć jak skrypt działa :). W paczce, którą ściągasz dopuszczalna ilość wywołań to 25/30 sekund. A blokada zakładana jest na 30 minut.

Widzę, że muszę poprawić opis strony testowe, żeby użytkownicy się nie mylili.

[edit]

Poprawiłem opis na stronie i sekcji testów udostępniłem też stronę z blokowaniem przy przekroczeniu 25 wywołań/30 sekund (domyślna konfiguracja skryptu) przy obniżonym czasie blokady na 3 minuty.

Skrypt chroniący zasoby serwera przed atakami botów exaBotDefender: https://docs.google.com/View?id=dgkd4pj4_0hfj5j4gx

Odnośnik do komentarza
Udostępnij na innych stronach

Przy 30 wywołaniach na sekunda sens zainstalowania takiego blokera staje się kontrowersyjny.

IMHO lepiej jest tą ilość ustawić na kilka i w razie wystąpienia blokady wyświetlić stronę z graficznym interfejsem do rozpoznania user / robot. Przykładowe rozwiązanie opisałem w https://www.forum.optymalizacja.com/index.php?showtopic=56314

HTTP 200 usługi IT -> Dariusz Janicki | Realizacja serwisów www oraz oprogramowania w PHP / C# / Golang / Node.js / MySQL/ Laravel
Komory normobaryczne - normobaria.tech Wykonawca montażu i instalacji komory normobarii

Odnośnik do komentarza
Udostępnij na innych stronach

Przy 30 wywołaniach na sekunda sens zainstalowania takiego blokera staje się kontrowersyjny.

Nie rozumiem o co chodzi :). Nigdzie nie pisałem też, że limit to 30 wywołań/sekundę. Zerknij do kodu źródłowego, jest krótki i nieskomplikowany. W blokowaniu przekroczenia 25 wywołań w ciągu 30 sekund nie ma nic kontrowersyjnego. Ewentualnie można sobie podnieść tą wartość, chociaż dla zaplecz czy wordpressów obniżyłbym tą wartość do 15.

Poza tym jak pisałem, to nie jest rozwiązanie koncepcyjne, ja to stosuję od roku czasu na stronie z około 2500 unikalnych odwiedzin/doba.

...w razie wystąpienia blokady wyświetlić stronę z graficznym interfejsem do rozpoznania user / robot. Przykładowe rozwiązanie opisałem w https://www.forum.optymalizacja.com/index.php?showtopic=56314

OK, to można zaimplementować jako dodatek, ale ja osobiście nie widzę sensu. Różnica w szybkości w działaniu bota i człowieka jest na tyle duża, że IMO można wyznaczyć granicę, której człowiek nie przekroczy na pewno. A jak nawet jakiś człowiek się złapie to blokujemy dostęp tylko na 30 czy 15 minut a nie permanentnie.

Dodałem nową opcję, która powinna być zaimplementowana od początku. W razie zablokowania bota do pliku bdsave/locklog.txt wpisany zostanie czas i IP zablokowanego bota. Kolejne wersje zawsze będę ze sobą kompatybilne, po ściągnięciu paczki wystarczy podmienić plik exaBD.php .

Skrypt chroniący zasoby serwera przed atakami botów exaBotDefender: https://docs.google.com/View?id=dgkd4pj4_0hfj5j4gx

Odnośnik do komentarza
Udostępnij na innych stronach

Źle odczytałem te "wywołań to 25/30 sekund" jako dopuszczalna ilość wywołań 30 na sekundę :)

Jeśli user przeglądający serwis załapie się na blokadę, bez zrozumiałego dla niego powodu przestanie taki serwis odwiedzać...

----------

Tak na marginesie w Twój "bloker" jest zabójstwem dla SEO, bo blokuje mam również boot sieciowy wyszukiwarki na którym wszystkim zależy. Ustawiłem w FF user agenta na googlebota przedstawiającego się:

Mozilla/5.0 (compatible; Googlebot/2.1; +https://www.google.com/bot.html)

dla testowej strony https://www.web6.pl/exaBotDefender/test/

i mamy exaBotDefender. Dostęp do strony został zablokowany na 3 minuty.

Wiec cos nie tak z tym Twoim oprogramowaniem przynajmniej tym demo...

HTTP 200 usługi IT -> Dariusz Janicki | Realizacja serwisów www oraz oprogramowania w PHP / C# / Golang / Node.js / MySQL/ Laravel
Komory normobaryczne - normobaria.tech Wykonawca montażu i instalacji komory normobarii

Odnośnik do komentarza
Udostępnij na innych stronach

Zarchiwizowany

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

  • Ostatnio przeglądający   0 użytkowników

    • Brak zarejestrowanych użytkowników przeglądających tę stronę.

×
×
  • Dodaj nową pozycję...

Powiadomienie o plikach cookie

Umieściliśmy na Twoim urządzeniu pliki cookie, aby pomóc Ci usprawnić przeglądanie strony. Możesz dostosować ustawienia plików cookie, w przeciwnym wypadku zakładamy, że wyrażasz na to zgodę. Warunki użytkowania Polityka prywatności