איך מתמודדים עם התקפת בוטים פרסומיים על האתר

כך מתמודדים עם בעית cpu עודפת שנוצרת מהתנפלות של בוטים פרסומיים
רשימת הבוטים שנכנסו לאתר לפי מספר הכניסות. בראש הרשימה, בפער עצום אפשר למצוא בוטים לא מזוהים. וזה מה שחשוב בטבלה.

בשנים האחרונות התרחקתי קצת מתחום האתרים ואני עוסק הרבה יותר בתכנות של מערכות מורכבות יותר, אבל נשארו ברשותי כמה אתרים שאני מתחזק ולפני כחודשיים גיליתי בעיה מעניינת באחד מהם שגרמה להשבתתו המלאה. לפי מה שהבנתי זה קורה לא מעט פעמים.
האתר מאוחסן בחברת site ground שהיא חברה מצויינת שגם האתר הזה מאוחסן אצלה (נכון לכתיבת שורות אלו). אני מאוד מרוצה מהחברה הזו כי יש לה תמיכה מצויינת. באיזור תחילת חודש פברואר קיבלתי התראה מהחברה על שימוש חורג ב-CPU. כותרת המייל היתה (בהתחלה) Your site Reached Allowed Daily Executions ואחרי זה Your site Reached Allowed Monthly Executions מהר מאוד. מה זה אומר? לכל אתר, בכל חברת איחסון, מוקצה מספר מסוים של כוח חישוב או 'הרצות'. איך מודדים את זה? בגישה הנאיבית ביותר כל כניסה לאתר נחשבת כהרצה. אם למשל יש לי וורדפרס ומישהו טוען את ה-index.php, ה-index.php הוא בעצם תוכנה שמריצה את הוורדפרס בכל כניסה. אבל כתבתי שזו גישה נאיבית – כיוון שלא מעט אתרים משתמשים בשירותי cache שמאיצים את פעולת האתר. הם עושים את זה באמצעות יצירה של עותקים סטטיים של HTML והפניית הגולש אל העותקים הסטטיים ולא אל דף ה-PHP. כך משיגים גם ביצועים טובים יותר וגם לא כל כניסה נחשבת כהרצה. טעינה של דפים סטטיים ותמונות לא נחשבת כהרצה. לפיכך, הכמות המוקצית לכל אתר היא גבוהה מאוד (כ-60,000) ולא אמורה להזיז לאתרים שיש להם מאות אלפי ביקורים לחודש. בטח ובטח לאתרים היותר קטנים.
זו הסיבה שמאוד הופתעתי שקיבלתי את ההתראות האלו. ישר בדקתי את ה-cache של האתרים שמאוחסנים באותו שרת שיתופי. חלק מהם הם אתרי מדיה ויקי, דבר שהוא יותר בעייתי אבל ניחא. תיקנתי, שיפצתי ומנעתי. וידאתי שאתרי הוורדפרס משתמשים בתוסף של Cache (ויש כמה כאלו בוורדפרס) וגם שאתרי המדיה ויקי מקונפגים היטב. למרות זאת, המשכתי לקבל את ההתראות האלו. הייתי צריך לעשות בדיקה יותר עמוקה.

הכלי הטוב ביותר לבדיקת עומסים ומה קורה בשרת שלנו הוא AWStats, תוכנה מבוססת קוד פתוח שמותקנת ברוב השרתים (אם היא לא מותקנת אצלכם, זה הזמן לבדוק אולי ספק אחר יתאים לכם יותר). לרוב ניתן לגשת אליה בקלות באמצעות Cpanel או כל אבסטרקציה אחרת שיש בשרת השיתופי שלכם.

awstats icon

לחיצה על האייקון תראה לכם את רשימת הדומיינים המאוחסנים על השרת. כדאי להתחיל עם הגדול והמרכזי. הלוג שם מראה לכם באופן פשוט וברור מה כמות המבקרים. מבט מהיר ב-Summary יכול להראות לכם אם הבעיה בכמות ה-CPU נגרמת מכמות המבקרים:

הנתון הרלוונטי הוא: pages: 55,923 ממקורות מזוהים pages: 184,469 ממקורות לא מזוהים.
הנתון הרלוונטי הוא:
pages: 55,923 ממקורות מזוהים
pages: 184,469 ממקורות לא מזוהים.

אפשר לראות שבעוד כמות המבקרים כאן היא נמוכה יחסית (מדובר בדו"ח שהוצאתי בתחילת החודש ולא משקף פעילות חודשית שלמה) כמות המבקרים ה'לא מזוהים' היא עצומה – פי 4. זאת אומרת על כל מבקר לגיטימי אחד היו ארבעה טרמפיסטים שהעיקו מאוד על האתר. מי הם הטרמפיסטים האלו? כניסה לאיזור בדו"ח של Robots/Spiders visitors מראה לנו:

רשימת הבוטים שנכנסו לאתר לפי מספר הכניסות. בראש הרשימה, בפער עצום אפשר למצוא בוטים לא מזוהים. וזה מה שחשוב בטבלה.
רשימת הבוטים שנכנסו לאתר לפי מספר הכניסות. בראש הרשימה, בפער עצום אפשר למצוא בוטים לא מזוהים. וזה מה שחשוב בטבלה.

בעוד שיש כאן בוטים שאני אשמח לקבל כמו הבוט של גוגל (שסורק את האתר) ובוטים נוספים כמו של יאהו, בינג ואלקסה. יש כמו אדירה שמגמדת את כל הבוטים הלגיטימיים. מיהם הבוטים האלו? כולם כאחד נכנסים תחת הקטגוריה של:

Unknown robot (identified by 'bot' followed by a space or one of the following characters _+:,.;/\-)

מה זה אומר? כל מי שנכנס לאתר מזדהה באמצעות ה-user agent שלו. לגולשים אנושיים יש את שם הדפדפן בתור ה-user agent. בוטים מכילים את השם שלהם. הטקסט שלעיל אומר שמדובר בערימת בוטים שיש להם תחילת bot בשם עם תוים שבאים אחר כך. מה המטרה שלהם בחיים? יש כאלו שינסו לשתול תגובות פיקטיביות, יש כאלו שפשוט יציגו referrer עם איזשהו לינק כי שתבדוק את הסטטיסטיקות ותתפתה להכנס ללינק ועוד שאר ג'אנק פרסומי. בניגוד לגוגל בוט, יאהו ושאר החברים – אנחנו לא ממש רוצים את הבוטים האלו באתר שלנו. מה עושים? חוסמים. ישנן כמה שיטות לחסום, השיטה המועדפת עלי היא באמצעות ה-htaccess שקיים בשרתי אפאצ'י שמשמשים את רוב האתרים בעולם. כתבתי מדריך מפורט ל-htaccess שמסביר על המבנה הלוגי שלו. אבל בגדול מה שאני עושה זה לבדוק את ה-User agent. אם הוא מתחיל במילה Bot ויש אחריו זבל, אני מעיף אותו. בנוסף, הוספתי רשימה של בוטים מגעילים שאין להם את השם bot אבל אני צריך אותם כמו אקורדיון במסע ציד באתר שלי. כל מי שעובר את הבדיקה מקבל הפתעה – דף 403. שיסרקו את זה.

איך עושים את זה? כאמור מוסיפים כמה חוקים ל-htaccess. עכשיו – אם אתם לא יודעים מה זה, לא מבינים מספיק וכו' – אל תעשו את זה. ואם אתם עושים את זה והאתר שלכם מתפוצץ, אל תבואו אלי בטענות ובתואנות. htaccess זה לא בשמים, אבל צריך להכיר regex וצריך להכיר את המבנה שלו. לחיצה על שני הקישורים שנתתי תיתן לכם מספיק מידע.

<IfModule mod_rewrite.c>
		RewriteEngine On

		RewriteCond %{HTTP_USER_AGENT} ^bot [NC,OR]
		RewriteCond %{HTTP_USER_AGENT} ^(aesop_com_spiderman|alexibot|backweb|bandit|batchftp|bigfoot) [NC,OR]
		RewriteCond %{HTTP_USER_AGENT} ^(black.?hole|blackwidow|blowfish|botalot|buddy|builtbottough|bullseye) [NC,OR]
		RewriteCond %{HTTP_USER_AGENT} ^(cheesebot|cherrypicker|chinaclaw|collector|copier|copyrightcheck) [NC,OR]
		RewriteCond %{HTTP_USER_AGENT} ^(cosmos|crescent|curl|custo|da|diibot|disco|dittospyder|dragonfly) [NC,OR]
		RewriteCond %{HTTP_USER_AGENT} ^(drip|easydl|ebingbong|ecatch|eirgrabber|emailcollector|emailsiphon) [NC,OR]
		RewriteCond %{HTTP_USER_AGENT} ^(emailwolf|erocrawler|exabot|eyenetie|filehound|flashget|flunky) [NC,OR]
		RewriteCond %{HTTP_USER_AGENT} ^(frontpage|getright|getweb|go.?zilla|go-ahead-got-it|gotit|grabnet) [NC,OR]
		RewriteCond %{HTTP_USER_AGENT} ^(grafula|harvest|hloader|hmview|httplib|httrack|humanlinks|ilsebot) [NC,OR]
		RewriteCond %{HTTP_USER_AGENT} ^(infonavirobot|infotekies|intelliseek|interget|iria|jennybot|jetcar) [NC,OR]
		RewriteCond %{HTTP_USER_AGENT} ^(joc|justview|jyxobot|kenjin|keyword|larbin|leechftp|lexibot|lftp|libweb) [NC,OR]
		RewriteCond %{HTTP_USER_AGENT} ^(likse|linkscan|linkwalker|lnspiderguy|lwp|magnet|mag-net|markwatch) [NC,OR]
		RewriteCond %{HTTP_USER_AGENT} ^(mata.?hari|memo|microsoft.?url|midown.?tool|miixpc|mirror|missigua) [NC,OR]
		RewriteCond %{HTTP_USER_AGENT} ^(mister.?pix|moget|mozilla.?newt|nameprotect|navroad|backdoorbot|nearsite) [NC,OR]
		RewriteCond %{HTTP_USER_AGENT} ^(net.?vampire|netants|netcraft|netmechanic|netspider|nextgensearchbot) [NC,OR]
		RewriteCond %{HTTP_USER_AGENT} ^(attach|nicerspro|nimblecrawler|npbot|octopus|offline.?explorer) [NC,OR]
		RewriteCond %{HTTP_USER_AGENT} ^(offline.?navigator|openfind|outfoxbot|pagegrabber|papa|pavuk) [NC,OR]
		RewriteCond %{HTTP_USER_AGENT} ^(pcbrowser|php.?version.?tracker|pockey|propowerbot|prowebwalker) [NC,OR]
		RewriteCond %{HTTP_USER_AGENT} ^(psbot|pump|queryn|recorder|realdownload|reaper|reget|true_robot) [NC,OR]
		RewriteCond %{HTTP_USER_AGENT} ^(repomonkey|rma|internetseer|sitesnagger|siphon|slysearch|smartdownload) [NC,OR]
		RewriteCond %{HTTP_USER_AGENT} ^(snake|snapbot|snoopy|sogou|spacebison|spankbot|spanner|sqworm|superbot) [NC,OR]
		RewriteCond %{HTTP_USER_AGENT} ^(superhttp|surfbot|asterias|suzuran|szukacz|takeout|teleport) [NC,OR]
		RewriteCond %{HTTP_USER_AGENT} ^(telesoft|the.?intraformant|thenomad|tighttwatbot|titan|urldispatcher) [NC,OR]
		RewriteCond %{HTTP_USER_AGENT} ^(turingos|turnitinbot|urly.?warning|vacuum|vci|voideye|whacker) [NC,OR]
		RewriteCond %{HTTP_USER_AGENT} ^(libwww-perl|widow|wisenutbot|wwwoffle|xaldon|xenu|zeus|zyborg|anonymouse) [NC,OR]
		# STARTS WITH WEB
		RewriteCond %{HTTP_USER_AGENT} ^web(zip|emaile|enhancer|fetch|go.?is|auto|bandit|clip|copier|master|reaper|sauger|site.?quester|whack) [NC,OR]
		# ANYWHERE IN UA -- GREEDY REGEX
		RewriteCond %{HTTP_USER_AGENT} ^.*(craftbot|download|extract|stripper|sucker|ninja|clshttp|webspider|leacher|collector|grabber|webpictures).*$ [NC]
		RewriteCond %{HTTP_USER_AGENT} ^BlackWidow [OR] 
		RewriteCond %{HTTP_USER_AGENT} ^Bot\ mailto:[email protected] [OR] 
		RewriteCond %{HTTP_USER_AGENT} ^ChinaClaw [OR] 
		RewriteCond %{HTTP_USER_AGENT} ^Custo [OR] 
		RewriteCond %{HTTP_USER_AGENT} ^DISCo [OR] 
		RewriteCond %{HTTP_USER_AGENT} ^Download\ Demon [OR] 
		RewriteCond %{HTTP_USER_AGENT} ^eCatch [OR] 
		RewriteCond %{HTTP_USER_AGENT} ^EirGrabber [OR] 
		RewriteCond %{HTTP_USER_AGENT} ^EmailSiphon [OR] 
		RewriteCond %{HTTP_USER_AGENT} ^EmailWolf [OR] 
		RewriteCond %{HTTP_USER_AGENT} ^Express\ WebPictures [OR] 
		RewriteCond %{HTTP_USER_AGENT} ^ExtractorPro [OR] 
		RewriteCond %{HTTP_USER_AGENT} ^EyeNetIE [OR] 
		RewriteCond %{HTTP_USER_AGENT} ^FlashGet [OR] 
		RewriteCond %{HTTP_USER_AGENT} ^GetRight [OR] 
		RewriteCond %{HTTP_USER_AGENT} ^GetWeb! [OR] 
		RewriteCond %{HTTP_USER_AGENT} ^Go!Zilla [OR] 
		RewriteCond %{HTTP_USER_AGENT} ^Go-Ahead-Got-It [OR] 
		RewriteCond %{HTTP_USER_AGENT} ^GrabNet [OR] 
		RewriteCond %{HTTP_USER_AGENT} ^Grafula [OR] 
		RewriteCond %{HTTP_USER_AGENT} ^HMView [OR] 
		RewriteCond %{HTTP_USER_AGENT} HTTrack [NC,OR] 
		RewriteCond %{HTTP_USER_AGENT} ^Image\ Stripper [OR] 
		RewriteCond %{HTTP_USER_AGENT} ^Image\ Sucker [OR] 
		RewriteCond %{HTTP_USER_AGENT} Indy\ Library [NC,OR] 
		RewriteCond %{HTTP_USER_AGENT} ^InterGET [OR] 
		RewriteCond %{HTTP_USER_AGENT} ^Internet\ Ninja [OR] 
		RewriteCond %{HTTP_USER_AGENT} ^JetCar [OR] 
		RewriteCond %{HTTP_USER_AGENT} ^JOC\ Web\ Spider [OR] 
		RewriteCond %{HTTP_USER_AGENT} ^larbin [OR] 
		RewriteCond %{HTTP_USER_AGENT} ^LeechFTP [OR] 
		RewriteCond %{HTTP_USER_AGENT} ^Mass\ Downloader [OR] 
		RewriteCond %{HTTP_USER_AGENT} ^MIDown\ tool [OR] 
		RewriteCond %{HTTP_USER_AGENT} ^Mister\ PiX [OR] 
		RewriteCond %{HTTP_USER_AGENT} ^Navroad [OR] 
		RewriteCond %{HTTP_USER_AGENT} ^NearSite [OR] 
		RewriteCond %{HTTP_USER_AGENT} ^NetAnts [OR] 
		RewriteCond %{HTTP_USER_AGENT} ^NetSpider [OR] 
		RewriteCond %{HTTP_USER_AGENT} ^Net\ Vampire [OR] 
		RewriteCond %{HTTP_USER_AGENT} ^NetZIP [OR] 
		RewriteCond %{HTTP_USER_AGENT} ^Octopus [OR] 
		RewriteCond %{HTTP_USER_AGENT} ^Offline\ Explorer [OR] 
		RewriteCond %{HTTP_USER_AGENT} ^Offline\ Navigator [OR] 
		RewriteCond %{HTTP_USER_AGENT} ^PageGrabber [OR] 
		RewriteCond %{HTTP_USER_AGENT} ^Papa\ Foto [OR] 
		RewriteCond %{HTTP_USER_AGENT} ^pavuk [OR] 
		RewriteCond %{HTTP_USER_AGENT} ^pcBrowser [OR] 
		RewriteCond %{HTTP_USER_AGENT} ^RealDownload [OR] 
		RewriteCond %{HTTP_USER_AGENT} ^ReGet [OR] 
		RewriteCond %{HTTP_USER_AGENT} ^SiteSnagger [OR] 
		RewriteCond %{HTTP_USER_AGENT} ^SmartDownload [OR] 
		RewriteCond %{HTTP_USER_AGENT} ^SuperBot [OR] 
		RewriteCond %{HTTP_USER_AGENT} ^SuperHTTP [OR] 
		RewriteCond %{HTTP_USER_AGENT} ^Surfbot [OR] 
		RewriteCond %{HTTP_USER_AGENT} ^tAkeOut [OR] 
		RewriteCond %{HTTP_USER_AGENT} ^Teleport\ Pro [OR] 
		RewriteCond %{HTTP_USER_AGENT} ^VoidEYE [OR] 
		RewriteCond %{HTTP_USER_AGENT} ^Web\ Image\ Collector [OR] 
		RewriteCond %{HTTP_USER_AGENT} ^Web\ Sucker [OR] 
		RewriteCond %{HTTP_USER_AGENT} ^WebAuto [OR] 
		RewriteCond %{HTTP_USER_AGENT} ^WebCopier [OR] 
		RewriteCond %{HTTP_USER_AGENT} ^WebFetch [OR] 
		RewriteCond %{HTTP_USER_AGENT} ^WebGo\ IS [OR] 
		RewriteCond %{HTTP_USER_AGENT} ^WebLeacher [OR] 
		RewriteCond %{HTTP_USER_AGENT} ^WebReaper [OR] 
		RewriteCond %{HTTP_USER_AGENT} ^WebSauger [OR] 
		RewriteCond %{HTTP_USER_AGENT} ^Website\ eXtractor [OR] 
		RewriteCond %{HTTP_USER_AGENT} ^Website\ Quester [OR] 
		RewriteCond %{HTTP_USER_AGENT} ^WebStripper [OR] 
		RewriteCond %{HTTP_USER_AGENT} ^WebWhacker [OR] 
		RewriteCond %{HTTP_USER_AGENT} ^WebZIP [OR] 
		RewriteCond %{HTTP_USER_AGENT} ^Wget [OR] 
		RewriteCond %{HTTP_USER_AGENT} ^Widow [OR] 
		RewriteCond %{HTTP_USER_AGENT} ^WWWOFFLE [OR] 
		RewriteCond %{HTTP_USER_AGENT} ^Xaldon\ WebSpider [OR] 
		RewriteCond %{HTTP_USER_AGENT} ^Zeus 
		RewriteRule ^.* - [F]
	</IfModule>

בגדול זה מה שעבד בשבילי. אבל יש כמה דרכים להלחם בתופעה הזו גם ללא htaccess. אני בחור פשוט ואני מעדיף דרכים פשוטות, אבל אם יש דרכים יותר טובות – התגובות פתוחות כאן 🙂

פוסטים נוספים שכדאי לקרוא

ספריות ומודולים

מציאת PII באמצעות למידת מכונה

כך תגנו על משתמשים שלכם שמעלים מידע אישי רגיש כמו תעודות זהות באמצעות שירות אמאזוני.

בינה מלאכותית

Safeguards על מודל שפה גדול (LLM)

פוסט בשילוב עם פודקאסט וסרטון על ההגנות שאפשר להציב על LLM בסביבת פרודקשן

בינה מלאכותית

להריץ ממשק של open-webui על הרספברי פיי

להפעיל ממשק של צ׳אט ג׳יפיטי שאפשר לגשת אליו מכל מחשב ברשת הביתית על רספברי פיי עם מודל בשם tinydolphin שרץ על רספברי פיי.

גלילה לראש העמוד