בשנים האחרונות התרחקתי קצת מתחום האתרים ואני עוסק הרבה יותר בתכנות של מערכות מורכבות יותר, אבל נשארו ברשותי כמה אתרים שאני מתחזק ולפני כחודשיים גיליתי בעיה מעניינת באחד מהם שגרמה להשבתתו המלאה. לפי מה שהבנתי זה קורה לא מעט פעמים.
האתר מאוחסן בחברת 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 או כל אבסטרקציה אחרת שיש בשרת השיתופי שלכם.
לחיצה על האייקון תראה לכם את רשימת הדומיינים המאוחסנים על השרת. כדאי להתחיל עם הגדול והמרכזי. הלוג שם מראה לכם באופן פשוט וברור מה כמות המבקרים. מבט מהיר ב-Summary יכול להראות לכם אם הבעיה בכמות ה-CPU נגרמת מכמות המבקרים:
אפשר לראות שבעוד כמות המבקרים כאן היא נמוכה יחסית (מדובר בדו"ח שהוצאתי בתחילת החודש ולא משקף פעילות חודשית שלמה) כמות המבקרים ה'לא מזוהים' היא עצומה – פי 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. אני בחור פשוט ואני מעדיף דרכים פשוטות, אבל אם יש דרכים יותר טובות – התגובות פתוחות כאן 🙂
2 תגובות
בעיה ידועה שבגללה סגרו לי את החשבון בהוסגייטור למרות כל ההסברים שלי שאין לי הרבה גולשים.
מה הפתרון היותר טוב חוץ מהקובץ שהצעתה?
גיטהאב עם רשימה מתעדכנת של הבוטים
https://github.com/mitchellkrogza/apache-ultimate-bad-bot-blocker/tree/master/.htaccess
זה דומה לחסימה של אתרים בעייתים דרך ה HOSTFILE