چرا خیلی از توسعهدهندهها CORS رو نمیفهمن
خلاصهٔ کاملتر
نویسنده که تو مشاورهٔ فولاستک با کلی توسعهدهنده از شرکتهای مختلف کار کرده، میگه یه مشکل مشترک زیاد میبینه: خیلی از وبدولوپرها درست نمیفهمن CORS چطور کار میکنه. اون این رو با آسیبپذیری معروف Zoom در سال ۲۰۱۹ گره میزنه که محقق امنیتی جاناتان لایچ کشفش کرد.
ماجرا این بود که زوم یه وبسرور رو localhost کاربر (روی پورت ۱۹۴۲۱) اجرا میکرد؛ وقتی یه لینک زوم باز میشد، سایت zoom.us به این سرور محلی درخواست میداد تا اپ نیتیو زوم رو باز کنه. اما بهجای درخواست معمولی AJAX، زوم جواب سرور رو تو ابعاد یه فایل تصویر کد میکرد تا CORS رو دور بزنه — یه هک عجیب برای فرار از سیاست same-origin مرورگر.
به گفتهٔ نویسنده، فرض پشت این کار غلط بوده: زوم فکر میکرده مرورگر برای سرورهای localhost سیاست CORS رو نادیده میگیره، در حالی که کروم برای localhost هم هدرهای CORS رو رعایت میکنه (همون کاری که هر وقت فرانتاند Create React App رو رو یه پورت و API رو رو پورت دیگه اجرا میکنی، اتفاق میافته). نتیجهٔ این دور زدن این شد که نهفقط سایت زوم، بلکه هر سایت دیگهای رو اینترنت هم میتونست عملیات رو تو کلاینت نیتیو تریگر کنه و جوابش رو بخونه.
نویسنده میگه پیادهسازی امن چه شکلی بود: اون وبسرور محلی باید یه REST API درست میداشت و هدر Access-Control-Allow-Origin رو با مقدار ست میکرد، تا فقط جاوااسکریپت روی دامنهٔ zoom.us بتونه باهاش حرف بزنه. علاوه بر این، یه هدر Content Security Policy هم لازم بود تا جلوی رندر شدن صفحه داخل iframe رو بگیره. کلاً هم میگه اجرای یه وبسرور روی localhost که دسترسیهای حساس (مثل نصب نرمافزار) میده، ذاتاً پرریسکه.
نکتهٔ کلیتر نویسنده اینه که توسعهدهندهها فقط میخوان کدشون کار کنه و دور زدن سیاست same-origin شاید کار رو راه بندازه، ولی وقتی یکی بفهمه چیکار کردی، دردسری مثل زوم پیش میاد. اون اشاره میکنه که خیلی از جوابهای Stack Overflow هم دیفالتهای ناامن (مثل ست کردن مبدأ به *) رو پیشنهاد میدن که اگه عینبهعین کپی بشن، اپ رو آسیبپذیر میکنن؛ و میپرسه مشکل از پیچیدگی API خود CORSه یا از کمبود آموزش درست.
نکات کلیدی:
- زوم برای دور زدن CORS جواب سرور محلی رو تو ابعاد یه تصویر کد میکرد؛ همین یه سوراخ امنیتی بزرگ باز کرد.
- فرض «مرورگر برای localhost سیاست CORS رو نادیده میگیره» غلطه؛ کروم برای localhost هم CORS رو رعایت میکنه.
- راهحل درست: ست کردن Access-Control-Allow-Origin روی دامنهٔ مجاز، بهعلاوهٔ هدر CSP برای بلاک کردن iframe.
- ست کردن مبدأ روی * یه دیفالت ناامن رایجه که اپ رو آسیبپذیر میکنه.
- اجرای وبسرور با دسترسی حساس روی localhost ذاتاً پرریسکه.




