Սքրեյպերի հարձակում Cloudflare-ի Free պլանում. ինչը կանգնեցրեց այն և ինչը մենք անջատված թողեցինք
Օպերացիաներ
Մի առավոտ մեր նկարագրությունների կայքերից մեկը դադարեց բացվելուց։ Cloudflare-ը այցելուներին ցույց էր տալիս 524 սխալ, սկզբնական սերվերը յուրաքանչյուր էջ բեռնում էր երկուսից վեց րոպեում, և մենք մոտ տասը ժամ ոչինչ չգիտեինք։ Պատճառը սքրեյպեր էր, որն անցնում էր բնակչության պրոքսիների միջով՝ վայրկյանում մոտ 225 հարցում կատարելով։
Հարձակման բնույթը
- Հազարավոր հասցեներ, յուրաքանչյուրից մեկից երեք հարցում։ Տնային լայնաշերտ միացումներ ԱՄՆ-ում, Իսպանիայում, Ֆրանսիայում, Բրազիլիայում, Մեծ Բրիտանիայում և այլուր, այնպիսի երթևեկություն, որը վարձում է բնակչության պրոքսի ցանցը։
- Chrome օգտատերի agent-ներ Mac-ի համար, 103-ից 151 տարբերակների համարներով։
- Գրեթե երբեք cookie կամ Referer չկա։ Սերվերում մեր նմուշառած 2,697 հարցումներից 4-ը ուներ cookie, 4-ը՝ Referer։
- Երկու տեսակի կլիենտ։ Կեսից ավելին չուղարկում էր
Sec-Fetch-*header-ներ և client hints. սա օգտատերի agent-ի տողը պատճենած սկրիպտ էր։ Մյուս կեսը ուղարկում էր ամբողջական browser header-ներ. սա headless browser էր։
Յուրաքանչյուր հարցման համար էջը վերարտադրվում էր, ուստի յուրաքանչյուր worker հերթ էր դնում հարյուրավոր վերարտադրումներ և հասնում իր CPU սահմանաչափին։
Ինչու հասցեների սահմանաչափերը չէին կարողանում օգնել
Rate limit-ը հաշվում է հարցումները ըստ հասցեի։ Հազարավոր հասցեներից յուրաքանչյուրից մեկից երեք հարցումների դեպքում ոչ մի առանձին հասցե երբեք չի մոտենում սահմանաչափին։ Երկրները արգելափակելը կարգելափակեր էր մեր այցելուներին։ Այն, ինչ սքրեյպերը չէր կարողանում էժան կեղծել, այն էր, որ վարվեր այնպես, ինչպես կայք այցելած browser-ը։
Cloudflare-ի եզրում. երեք անվճար կանոն
Free պլանը թույլ է տալիս յուրաքանչյուր zone-ի համար հինգ WAF custom rule։ Մենք օգտագործեցինք երեքը, բոլորը՝ managed challenge-ով, ոչ թե block-ով, որպեսզի սխալմամբ բռնված մարդը կարողանա անցնել։
- Կեղծ browser. GET, որի user agent-ը պարունակում է
Chrome/և որը չունիSec-Fetch-Modeheader։ 2019-ից հետո յուրաքանչյուր Chrome ուղարկում է դա։ - Սքրեյպերի ամպեր. էջի հարցում Alibaba, Tencent և Huawei Cloud ցանցերից, որտեղից մեր ստուգածների մեծ մասը գալիս էր։
- Արտակարգ դեպք, անջատված է լռելյայն. GET, որը ընդհանրապես չունի cookie և չունի Referer։ Մարդը, ով եղել է կայքում, կամ ով գալիս է հղմամբ, անցնում է առանց խոչընդոտի. սքրեյպերը, որը չի պահում cookies, յուրաքանչյուր հարցման դեպքում հանդիպում է challenge-ի։ Մենք միացնում ենք այն միայն հարձակման ժամանակ, քանի որ այն նաև challenge է անում նրան, ով թարմ browser-ում գրում է հասցեն։
Երեքն էլ բաց են թողնում Cloudflare-ի հաստատված բոտերը, իրենց ռոբոտ անվանող user agent-ները, մեր սեփական հասցեները, API-ի և webhook-ի ուղիները, ինչպես նաև էջ չհանդիսացող ֆայլերը։ Երկու օր անց հեղեղը դեռ շարունակվում էր. մեկ ժամում կեղծ բրաուզերի կանոնը ավելի քան 10,000 հարցում էր ենթարկել ստուգման։ Cloudflare-ի կողմից մեկ հարցմամբ վերադարձված 10,000 իրադարձությունները գալիս էին 9,627 հասցեներից, որոնցից ոչ մեկը 4-ից ավելի չուներ։
Աղբյուրում՝ դարպասը հավելվածում
Առանց գլխի մասը ունի ամբողջական բրաուզերային headers, ուստի եզրային կանոնները միայնակ չեն բռնում այն, երբ արտակարգ կանոնը անջատված է։ Հավելվածի մեջ մենք էջի ռենդերերի առջև դրել ենք փոքրիկ middleware.
Sec-Fetch-Mode-ի և client hints-ի առանց Chrome user agent-ը ստանում է 403՝ մինչև որևէ աշխատանք կատարվելը;- անծանոթը, մեր cookie-ների և Referer-ի առանց, սպասարկվում է միայն այն դեպքում, երբ worker-ն ազատ հզորություն ունի, վայրկյանում մի քանի էջի արագությամբ։ Դրանից ավելի դեպքում 400 բայթանոց 503 էջը տեղադրում է cookie և երկու վայրկյանից վերաբեռնում է էջը։ Մարդը էջը ստանում է երկրորդ փորձից, իսկ cookie-ները չպահող սքրեյպերը՝ երբեք։
Առաջին րոպեին դարպասը մերժել էր մոտ 6,700 կեղծ բրաուզեր և հետ էր մղել մոտ 6,700 անծանոթի, միաժամանակ անծանոթներին մատուցելով վայրկյանում մոտ 9 էջ։ Դանդաղ հարցումները զրոյացել էին, worker-ների CPU-ն նվազել էր առավելագույնից մինչև 12-15 տոկոս, իսկ հիշողությունը՝ յուրաքանչյուրի մոտ 4-5 ԳԲ-ից մինչև 0.65 ԳԲ։
Ինչը մենք անջատված թողեցինք
- Bot Fight Mode. Այն ստուգման է ենթարկում ավտոմատացված երթևեկությունը և չի կարող բաց թողնվել custom կանոնով Free պլանում, ինչպես նաև բռնել էր մեր վճարային մատակարարի webhook-ները։
- Under Attack mode ամբողջ գոտու համար. Այն անցնում է interstitial-ով յուրաքանչյուր այցելուի, API հաճախորդի և webhook-ի։ Արտակարգ կանոնը նույն աշխատանքը կատարում է միայն անծանոթների էջի հարցումների համար։
- Free պլանի rate-limiting կանոնը. Այն հաշվում է ըստ հասցեի, ինչը այս հեղեղը երբեք չի գրգռում։
- AI քրոլերների արգելափակումը. Մենք ցանկանում ենք, որ AI որոնողական օգնականները գտնեն մեզ, և այդ քրոլերները խնդիր չէին։
Հիմնական եզրակացությունը
Բնակչական proxy-ների միջով հեղեղը հեշտ է նկատել նրանով, թե ինչ է պակասում. բրաուզերային fetch headers, cookies և Referers։ Ստուգեք դա եզրում, պահեք անծանոթները worker-ների ռենդերման հզորության սահմաններում, և համոզվեք, որ սերվերից դուրս ինչ-որ բան նկատում է, երբ էջը դադարում է բացվել։ Night Watch-ը փաթեթավորում է երեքն էլ. վոչդոգը, կանոնները՝ արտակարգի համար ավտոմատ անջատիչով, և դարպասը Python web app-երի համար։