با جدا کردن دو چیزی که همزمان تغییر کرده‌اند شروع کنید: مسیر شبکه و اجرا در مرورگر. VPN آدرس خروج را تغییر می‌دهد؛ اما مبدأ صفحه را تغییر نمی‌دهد، چون مبدأ از طرح، میزبان و درگاه ساخته می‌شود. اگر درخواست اکنون موفق می‌شود، چیزی در پاسخ تغییر کرده یا خود درخواست تغییر کرده است. یافتن اینکه کدام یک، تمام تحقیق است.

CORS یک پروتکل سرصفحه است که مرورگر آن را اجرا می‌کند، پس هیچ چیز روی مسیر شبکه نمی‌تواند آن را خاموش کند.

مبدأ یک آدرس IP نیست

مبدأ یک طرح، یک میزبان و یک درگاه است. مبدأ آدرسی نیست که بسته‌ها از آن خارج می‌شوند و IP‌ای نیست که سرور می‌بیند. به همین دلیل VPN می‌تواند هر آدرس قابل مشاهده را تغییر دهد و مبدأ را یکسان بگذارد. مرورگر Access-Control-Allow-Origin پاسخ را با مبدأ صفحه مقایسه می‌کند و آدرس خروج هرگز وارد این مقایسه نمی‌شود.

پس افزونه یا پراکسی‌ای که به نظر می‌رسد خطای CORS را درست می‌کند، کار دیگری می‌کند: سرصفحه‌ها را بازنویسی می‌کند یا درخواست را طوری مسیریابی می‌کند که دیگر میان‌مبدأ نباشد. هیچ‌کدام ویژگی VPN نیست.

مرورگر در واقع چه می‌فرستد

برای درخواست میان‌مبدأ که ساده نیست، مرورگر نخست یک پیش‌بررسی OPTIONS می‌فرستد که روش و سرصفحه‌های موردنظر را حمل می‌کند. سرور باید با مجوزهایی که می‌دهد پاسخ دهد و درخواست واقعی تنها وقتی دنبال می‌شود که آن پاسخ قواعد را برآورده کند. VPN مسیری را که هر دو تبادل را حمل می‌کند تغییر می‌دهد و می‌تواند پاسخ سرویس‌های میانی را تغییر دهد. اما رشته مبدأ یا شرط پیش‌بررسی را تغییر نمی‌دهد.

کلاینت خط فرمان معمولاً هیچ‌یک از این‌ها را نشان نمی‌دهد. ممکن است سرصفحه Origin را نفرستد، اغلب پیش‌بررسی را رد می‌کند و ممکن است اعتبارنامه متفاوتی داشته باشد. بدنه‌ای که به curl برگردانده می‌شود ثابت می‌کند سرور به curl پاسخ داده است.

پاسخی را که تغییر کرده پیدا کنید

پاسخ واقعی را در هر مسیر مقایسه کنید، نه فقط کد وضعیت. به سرصفحه‌های حامل مجوزهای CORS، نوع محتوا، هر تغییر مسیر و اینکه آیا گونه‌ای از WAF یا CDN صفحه متفاوتی ساخته است نگاه کنید. رد منطقه‌ای، تغییر مسیر احراز هویت یا صفحه خطای فاقد سرصفحه مجوز همه در مرورگر شکست می‌خورند، در حالی که شبیه باگ CORS به نظر می‌رسند. این‌ها تفاوت‌های مسیر تحویل هستند و همان چیزی‌اند که باید مستند شوند.

سرصفحه‌های پاسخ هر دو مسیر را ثبت کنید و خط به خط مقایسه کنید. اگر تنها تفاوت، نبودن Access-Control-Allow-Origin روی یک صفحه خطاست، علت را یافته‌اید.

سرویس را درست کنید، نه اجرا را

وقتی سرویس مال شماست، مبدأهای مجاز و امکانات درخواست را صریح اعلام کنید و سپس خطاهایی را که فرانت‌اند و واسطه‌هایش تولید می‌کنند بخوانید. اگر این کار را نمی‌کنید، مقایسه‌ای پاکسازی‌شده برای صاحب سرویس بفرستید. هرگز کوکی‌ها، سرصفحه‌های مجوز یا خروجی‌های نشست را در آن گزارش نگذارید، چون همان اعتبارنامه‌هایی هستند که سیاست برای محافظت از آن‌ها وجود دارد.

از افزونه‌های مرورگری که CORS را غیرفعال می‌کنند پرهیز کنید. آن‌ها مرز امنیتی را تغییر می‌دهند و در همان حال تفاوت پاسخی را که باید توضیح داده می‌شد پنهان می‌کنند، و همان شکست را برای همه کاربران دیگر باقی می‌گذارند.

هر دو پاسخ، مبدأ استفاده‌شده و مسیر پیموده‌شده را ثبت کنید. آن ثبت، شایعه VPN را به باگ سرویس تبدیل می‌کند.

مقالات مرتبط