Jak na kilka godzin zablokowałem StackOverflow w całej firmie?

Wystraszony bo StackOverflow nie działa

Jak na kilka godzin zablokowałem StackOverflow w całej firmie? Czyli o tym jak nieumiejętnie napisać web crawler.

StackOverflow to platforma, która z niejednego przeciętnego programisty zrobiła eksperta. Chyba ciężko w tych czasach wyobrazić sobie pracę programisty bez tego narzędzia. Kiedyś przypadkowo udało mi się na kilka godzin zablokować możliwość korzystania z tej strony w całej firmie. Zaraz po tym incydencie dało się zauważyć wzmożony ruch przy ekspresie do kawy i luźne rozmowy na open space. Niektórzy nawet wysnuli ciekawe wnioski, że chyba za dużo pracujemy, skoro zablokowali nam StackOverflow. Ale właściwie, o co chodzi? Co trzeba zrobić, żeby dostęp do takiej witryny został zablokowany?

Jak to się stało?

Zacznę od początku. Winny całego zmieszania jest Michał Sadowski i jego narzędzie do monitorowania internetu – Brand24. No dobra może Michał nie jest winny, ale na pewno mnie zainspirował. Otóż w drodze do Warszawy tłumaczyłem mojej kuzynce, jak może działać Brand24, i że sama koncepcja bez wnikania w szczegóły jest dość prosta. Otóż jest sobie program, który przegląda stronę internetową w poszukiwaniu słów kluczowych oraz linków. Po przejrzeniu danej strony odwiedza kolejne strony, używając wcześniej znalezionych linków, i potem jeszcze kolejne itd. Tak działa Google, DuckDuckGo i wiele innych narzędzi do indeksowania treści w internecie.

Ja "Czemu mój crawler jest zły?"

No dobra, ale co w końcu z tą blokadą dostępu. Otóż zaciekawiony tematem postanowiłem napisać swój własny bardzo prosty crawler. Po mniej więcej trzech godzinach pracy był gotowy. Zadaniem aplikacji było wyszukiwanie frazy “Michał Cholewiński” w całym internecie i wysyłanie na maila raportu gdzie udało się znaleźć moje nazwisko. Co prawda większość wyników należała do prezentera z telewizji o takim samym imieniu i nazwisku, ale udało się też znaleźć wzmianki o mnie. Kolejnego dnia w czasie pracy wpadłem na pomysł przyspieszenia aplikacji, więc od razu postanowiłem go wypróbować. Uruchomiłem program i wróciłem do służbowych zajęć. Przyznam że gdy pierwszy raz tego dnia probowałem sprawdzić coś na StackOverflow i nie udało mi się tego zrobić, nie rozumiałem, co się wydarzyło. Po prostu nie połączyłem kropek.

Można by się zastanowić, czemu poważna firma buduje takie rozwiązanie miesiącami, a ja w trzy godziny zrobiłem swój prywatny monitoring internetu. Jedyna różnica była taka, że moją aplikację blokowała co druga strona a Brand24 działa non-stop. No w sumie to nie jedyna różnica. Problem był o wiele większy. Po pierwsze pisząc tego typu aplikacje, trzeba to robić zgodnie ze sztuką. Istnieje wiele zasad, które mówią, jak wygląda poprawne zachowanie robota. Można ich przestrzegać albo po prostu pozwolić mu naparzać po internecie jakby jutra nie było. Ja nieświadomy tych zasad poszedłem drugą drogą.

Od strony technicznej

Aplikację napisałem w Javie z użyciem biblioteki JSOUP. Działanie polega na pobraniu jednej strony, sprawdzeniu jej zawartości i odwiedzeniu wszystkich nieodwiedzonych linków z tej strony. Czynność wykonywałem dosłownie w nieskończoność. Co kilka tysięcy odwiedzonych stron aplikacja wysyłała do mnie maila z raportem.

Dzięki dobremu wsparciu wielowątkowości mogłem zwiększyć szybkość przeglądania stron. Stworzyłem 20 wątków, z których każdy w ciągu jednej sekundy odpytywał kilka razy jedną witrynę. Jako jedną ze stron, od których zaczynałem poszukiwania, wybrałem StackOverflow. Jak łatwo się domyślić 20 wątków razy około 5 pobrań strony oraz dodatkowych zasobów daje dość nietypowy wynik jak na ruch zwykłego zjadacza chleba. Witryny takie jak StackOverflow też świetnie zdają sobie sprawę, że takie zachowanie na łączach to nic normalnego i po prostu blokują adresy IP takich delikwentów. Pech chciał, że tym razem zablokowali IP naszej firmy. Kod aplikacji można znaleźć tutaj.

Czego nie wiedziałem, pisząc własny crawler?

Ja wystraszony

Zabierając się za tę aplikację, nie wiedziałem wielu rzeczy o działaniu tego rodzaju systemów. Przede wszystkim nie wiedziałem, że aplikacja musi udawać człowieka. Twórcy aplikacji internetowych zabezpieczają się przed nadmiernym ruchem, który mogą generować boty. W tym celu budują rozwiązania, które mierzą ilość zapytań pochodzących z jednego adresu IP, osadzają na stronach ukryte linki, których przeciętny użytkownik nie zobaczy i nie kliknie, a robot raczej to zrobi, itp.

Drugą rzeczą, o której nie wiedziałem to fakt, że nie wszystkie strony możemy tak po prostu przeglądać. Wyobraźmy sobie, że piszemy crawler, który przegląda internetowy słownik języka angielskiego. Czy jesteśmy w stanie pobrać większość słów wraz z definicjami? Oczywiście, że tak. Czy to uczciwe? Oczywiście, że nie. Niektóre strony mają wyraźny zapis w regulaminie, że nie można ich scrapeować. Musimy na to uważać.

Zapisz się na newsletter, aby otrzymywać informacje o nowych artykułach oraz inne dodatki.

Jak ma działać crawler, aby nie szkodzić?

Istnieje kilka zasad, które musimy wdrożyć w takiej aplikacji, aby nie była blokowana oraz aby nie szkodziła stronom internetowym. Tak jak napisałem wyżej, aplikacja musi udawać człowieka. Wystarczy spróbować napisać swój crawler w taki sposób, aby symulował wizyty wielu użytkowników o różnych zachowaniach.

  1. Łączenie się do strony internetowej z różnych adresów IP. Gdy podejrzane żądania są wysyłane tylko z jednego adresu IP, to mechanizmy obronne przeglądanej strony mogą pomyśleć, że to jakiś atak. W przypadku gdy podobne żądania pochodzą z różnych IP, ruch przestaje być aż tak podejrzany.
  2. Klikanie po stronie w losowych odstępach czasu. Człowiek nigdy nie klika na stronie w równych odstępach czasu, czasem są to szybsze przejścia między podstronami a czasem wolniejsze.
  3. Symulowanie ruchu myszy. Użytkownicy przeważnie do przeglądania stron używają myszy, której kursor porusza się po ekranie w dość nieprzewidywalny sposób.
  4. Symulowanie przewijania strony. Praktycznie na każdej stronie internetowej coś zescrollować i jest to nieodłączny element zachowania użytkownika każdej strony internetowej.
  5. Respektowanie linków no-index oraz plików robots.txt. Strony internetowe często jawnie “mówią” nam co możemy, a czego nie możemy przeglądać. Powinniśmy to respektować.

Co z Captcha?

Captcha to rodzaj zabezpieczenia na stronach internetowych mających zapewnić, że formularze są wypełniane przez człowieka. Chodzi o taki widget, który wymaga od Ciebie przepisania jakiegoś zniekształconego tekstu albo wskazania podobnych obrazków.

Czy da się złamać captcha? Co jakiś czas powstają nowe zabezpieczenian, aby captcha była jeszcze bardziej odporna. Dzisiejsza technologie pozwala zarówno na tworzenie skomplikowanych zabezpieczeń jak i również na ich łamanie. W tym artykule można poczytać więcej na ten temat.

Podsumowanie

Po co napisałem ten artykuł? Uważam, że historia jest całkiem ciekawa i pokazuje, że nie wszystko, co jest publicznie dostępne w internecie, należy do nas i że nie możemy robić tam wszystkiego, co nam się podoba.

Jeśli w przyszłości, będziesz chciał napisać podobną aplikację to ważne, abyś wykonanie poprzedził sumienną analizą, aby ograniczyć sobie problemów. Zanim rozpoczniesz pracę, możesz spytać innych developerów lub swojego mentora o poradę odnośnie implementacji.

Zastanawiasz się być może, do czego w ogóle można potrzebować takiego mechanizmu. Istnieje wiele aplikacji poza Google, które indeksują strony. Jednym z bardziej popularnych przypadków użycia w ostatnim czasie jest skanowanie serwisów ogłoszeniowych z nieruchomościami albo z ofertami pracy.

Jeśli artykuł Ci się podobał, zapraszam do polubienia profilu na facebooku oraz obserwowania na instagramie. Zapraszam również do grupy Wsparcie w programowaniu i do kontaku.

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *