CORS چیست؟ قاعدهٔ مرورگر پشت هر خطای cross-origin
درخواستهای ساده، preflight و اعتبارنامهها، با آزمونهای curl.
خواندن راهنماراهنمای CDN.com.tr
Access-Control-Allow-Origin و دیگر سرآیندهای CORS را به پاسخهای یک قانون تحویل اضافه کنید، بگذارید مبدأ شما به درخواستهای preflight از نوع OPTIONS پاسخ دهد، و متدهایی را که API شما استفاده میکند در WAF مجاز کنید.
کش، امنیت، WAF و پاکسازی
Access-Control-Allow-Origin و دیگر سرآیندهای CORS را به پاسخهای یک قانون تحویل اضافه کنید، بگذارید مبدأ شما به درخواستهای preflight از نوع OPTIONS پاسخ دهد، و متدهایی را که API شما استفاده میکند در WAF مجاز کنید.
https://app.example.com، یا * برای فایلهایی که هر کسی میتواند بارگذاری کند.OPTIONS پاسخ میدهد.آنچه مرورگر میفرستد تعیین میکند کار کجا انجام شود.
GET ساده بارگذاری میشوند: preflight ندارند و Access-Control-Allow-Origin در قانون تنها چیزی است که لازم دارند. تا وقتی بهینهسازی تصویر در سطح حساب روشن است، فایلهای .jpg، .jpeg و .png سرآیندهای پاسخ قدیمیترین قانون دامنه را میگیرند، نه قانونِ مسیرشان را.PUT، PATCH، DELETE: مرورگر اول یک preflight میفرستد؛ مبدأ شما به آن پاسخ میدهد و قانون میتواند سرآیندهای CORS را به آن پاسخ اضافه کند.*، بهعلاوهٔ Access-Control-Allow-Credentials true.برای هر سرآیند یک منبع انتخاب کنید.
always تمام شود، روی پاسخهای 4xx و 5xx مبدأ شما هم.Vary: Origin فرستاده میشود.نمونهای برای یک API زیر /api/ که یک وباپلیکیشن آن را فراخوانی میکند. هر سطر یک سرآیند بنویسید؛ مقداری که فاصله دارد داخل گیومهٔ دوتایی نوشته میشود.
/api/ بزنید.Access-Control-Allow-Origin https://app.example.com، Access-Control-Allow-Methods "GET, POST, PUT, OPTIONS"، Access-Control-Allow-Headers "Content-Type, Authorization" و Access-Control-Max-Age 600.نتیجه مورد انتظار: قانون برچسبی مانند +4 هدر پاسخ نشان میدهد و وقتی لبه آن را ارائه کند، صفحه منتشرشده را نشان میدهد.
تا وقتی WAF سطح سایت روشن است و API از متدهایی فراتر از GET، HEAD، POST و OPTIONS استفاده میکند لازم است.
PUT، PATCH یا DELETE را بسته به نیاز API خود علامت بزنید، OPTIONS را علامتخورده نگه دارید و روی Save بزنید.نتیجه مورد انتظار: پنل ذخیره را تأیید میکند و تغییر ظرف 1-2 دقیقه منتشر میشود.
curl قواعد CORS را اعمال نمیکند، پس دقیقاً همان چیزی را نشان میدهد که لبه پاسخ میدهد.
Origin درخواست دهید.OPTIONS با Origin، Access-Control-Request-Method و Access-Control-Request-Headers.نتیجه مورد انتظار: درخواست ساده یک access-control-allow-origin دارد. preflight با 200 یا 204 همراه با origin، متدها و سرآیندهای مجاز پاسخ میدهد.
curl -s -o /dev/null -D - -H 'Origin: https://app.example.com' https://www.example.com/api/items | grep -iE '^(HTTP|access-control)'
curl -s -o /dev/null -D - -X OPTIONS -H 'Origin: https://app.example.com' -H 'Access-Control-Request-Method: PUT' -H 'Access-Control-Request-Headers: content-type' https://www.example.com/api/items | grep -iE '^(HTTP|access-control|x-mt-blocked-by)'
یک وباپلیکیشن روی app.example.com فونت، JSON یا پاسخهای API را از www.example.com بارگذاری میکند و مرورگر آنها را با خطای CORS مسدود میکند.
Header-Name value، بدون دونقطه، بنویسید، مثلاً Access-Control-Allow-Origin https://app.example.com. مقداری که فاصله دارد داخل گیومهٔ دوتایی نوشته میشود.Access-Control-* میفرستد، همان نام را زیر حذف سرآیندها علامت بزنید تا مرورگر یک مقدار واحد دریافت کند.PUT، PATCH یا DELETE استفاده میکند و WAF سطح سایت روشن است، آنها را زیر متدهای HTTP مجاز در صفحهٔ Security علامت بزنید.always تمام میشود به پاسخهای 4xx و 5xx مبدأ شما هم اضافه میشود.OPTIONS به مبدأ شما میروند و هرگز کش نمیشوند. وقتی مبدأ شما با 200 یا 204 به یک preflight پاسخ میدهد، سرآیندهای قانون به آن پاسخ اضافه میشوند؛ preflightی که با 401، 404 یا 405 پاسخ داده شود بدون آنها به مرورگر میرسد، مگر اینکه خط با always تمام شود. در قانونی با حفاظت با گذرواژه یا فهرست مجاز IP، لبه خودش به preflightی که از آن عبور نمیدهد با 401 یا 403 پاسخ میدهد.Access-Control-Allow-Origin به مرورگر میرسد: با دو مقدار، مرورگر پاسخ را رد میکند.Access-Control-Allow-Origin را بسته به سایت درخواستکننده تغییر میدهد، باید Vary: Origin را هم بفرستد. لبه این نسخهها را تا وقتی نگه داشتن یک نسخهٔ کش، صرفنظر از سرآیند Vary در قانون خاموش است، از هم جدا نگه میدارد.Access-Control-Request-Method و Access-Control-Request-Headers را زیر حذف سرآیندها بدون علامت بگذارید: نامهایی که آنجا علامت میخورند از درخواستهای ارسالی به مبدأ شما هم حذف میشوند، و مبدأ شما برای پاسخ به یک preflight این دو را میخواند.GET، HEAD، POST و OPTIONS بهطور پیشفرض مجازند. درخواستی با متدی که در فهرست نیست یک 403 بدون سرآیندهای CORS و با X-MT-Blocked-By: cdn-edge-security میگیرد که مرورگر آن را خطای CORS گزارش میکند..jpg، .jpeg و .png سرآیندهای پاسخ قدیمیترین قانون دامنه را میگیرند، نه قانونِ مسیرشان را: سرآیند CORS این تصاویر را در همان قانون بگذارید، با یک Access-Control-Allow-Origin ثابت. وقتی آن قدیمیترین قانون، قانون بررسی گواهی باشد، هیچ سرآیندی از قوانین نمیگیرند.لبه درخواستهای OPTIONS را به مبدأ شما میفرستد و هرگز آنها را کش نمیکند، پس مبدأ شما باید با 200 یا 204 به preflight پاسخ دهد. سرآیندهای پاسخ قانون به آن پاسخ اضافه میشوند: سرآیندهای CORS میتوانند از قانون بیایند و مبدأ شما فقط باید OPTIONS را بپذیرد. استثنا: در قانونی با حفاظت با گذرواژه یا فهرست مجاز IP، لبه خودش به preflightی که از آن عبور نمیدهد با 401 یا 403 پاسخ میدهد.
یک قانون مقدار یکسانی به هر پاسخ اضافه میکند: * یا یک origin مانند https://app.example.com. برای مجاز کردن چند origin، بگذارید برنامهٔ شما origin منطبق را همراه با Vary: Origin بفرستد، و Access-Control-Allow-Origin را در قانون نگذارید. درخواستهایی که کوکی یا اعتبارنامههای دیگر دارند به یک origin مشخص نیاز دارند، نه *.
از وضعیت درخواست ناموفق در پنل شبکهٔ مرورگر شروع کنید. یک 403 با X-MT-Blocked-By: cdn-edge-security از لبه میآید: آن را در لاگهای WAF پیدا کنید و اگر متد آن در فهرست نیست، آن را زیر متدهای HTTP مجاز اضافه کنید. هر 4xx یا 5xx دیگری بهطور پیشفرض بدون سرآیندهای قانون میرسد، پس اول آن پاسخ را درست کنید. خطی که با always تمام میشود، مانند Access-Control-Allow-Origin https://app.example.com always، به پاسخهای 4xx و 5xx مبدأ شما هم اضافه میشود. سپس بررسی کنید که دقیقاً یک Access-Control-Allow-Origin میرسد و با سایت درخواستکننده، از جمله scheme، مطابقت دارد.
تا وقتی WAF سطح سایت روشن است، صفحهٔ Security را باز کنید، متدها را زیر متدهای HTTP مجاز علامت بزنید و روی Save بزنید؛ تغییر ظرف 1-2 دقیقه منتشر میشود. متدهای درخواست مجاز در تب امنیت قوانین تحویل همان کارت را باز میکند. OPTIONS را علامتخورده نگه دارید: مرورگرها آن را برای preflight میفرستند.