أمان الويب / دليل حلول تحريري
تشخيص اختلاف تمهيد CORS والاعتماد
حدد مرحلة مشاركة المتصفح وعقد الأصل قبل تغيير الرأس أو إعادة فعل يغير الحالة.
قاعدة معرفة للقراءة فقط · بلا تعليقات عامة
تعرّف على الأعراض
قد يعمل الطلب بعميل سطر الأوامر بينما يعجز نص المتصفح عن قراءة رده، أو يفشل التمهيد، أو يبلغ الوصول بالاعتماد اختلاف الأصل. قد يكون الفعل الحقيقي وصل إلى الخادم أو لم يصل، بحسب الطلب ومرحلة الفشل. تكرار الكتابة لأن الرد مخفي فقط يمكن أن يكرر عملاً سبق تنفيذه.
افهم الأسباب المحتملة
- قد يختلف الأصل المضبوط بالبروتوكول أو المضيف أو المنفذ، أو لا تدعم الطريقة والرؤوس، أو يتعارض wildcard مع الاعتماد. وقد يغير التحويل أو ترتيب الوسيط الرد، أو يعيد المخبأ استخدام حقول تعتمد الأصل بصورة خاطئة. ليست CORS مصادقة حساب، ولا يثبت رأس Origin أن العميل موثوق أو مأذون.
افصل التمهيد والفعل ورؤية الرد
سجل أصل الواجهة وأصل الوجهة ونمط الاعتماد والطريقة وأسماء الرؤوس المطلوبة وفئة حالة الرد والتشخيص الموجود الملائم. لا تلتقط اعتماداً أو أجساماً خاصة. حدد هل الفشل في تفاوض القدرة، أم تفويض الخادم الفعلي، أم كشف المتصفح لرد مكتمل. أعد الحالة اصطناعياً وبضبط في بيئة مفوضة، لا بحركة متكررة لنقطة حية. يفيد نجاح غير المتصفح كدليل بروتوكول، لكنه لا يمارس إنفاذ مشاركة المتصفح.
قارن الأصل الدقيق وسياسة الاعتماد
الأصل بروتوكول ومضيف ومنفذ، لا عنوان URL كامل اعتباطي. أكد قائمة السماح المراجعة ولا تعكس كل أصل وارد. يحتاج كشف الرد بالاعتماد سياسة أصل صريحة متوافقة وفق القواعد الحالية؛ ليس wildcard إصلاحاً عاماً. تفحص الدالة المحلية حقائق توافق معلنة وتحفظ الأصل غير المدعوم مرفوضاً. ليست تنفيذ متصفح أو وسيطاً، ولا ترسل طلباً أو تثبت أن الخادم المقصود أنتج الرد. يبقى ذلك بحاجة دليل مستقل من التكامل الفعلي.
def sharing_review(request_origin, allow_origin, credentialed):
if credentialed and allow_origin == "*":
return "incompatible-credentialed-origin"
if allow_origin not in (request_origin, "*"):
return "origin-not-shared"
return "review-method-headers-and-server-permission"
assert sharing_review("https://portal.example.invalid", "*", True) == "incompatible-credentialed-origin"
assert sharing_review("https://portal.example.invalid", "https://other.example.invalid", True) == "origin-not-shared"
كل الأصول نطاقات خيالية محجوزة. تفحص الدالة السياسة النصية المعطاة فقط وتغفل قواعد CORS فعلية كثيرة. لا يستخدم المثال متصفحاً أو طلباً أو تمهيداً أو مخبأ أو اعتماداً؛ ولا تثبت نتائجه سلوك أي طبقة من تلك الطبقات.
راجع الوسيط والتحويل والمخبأ معاً
صحح الأصل والطريقة والرأس ونمط الاعتماد المعتمدة بضيق، وفق عملية المشروع المفوضة. تحقق من حقول الرد في النجاح والفشل ومسارات التحويل المهمة. إذا اختلفت المشاركة بالأصل فراجع Vary والمخبأ، ويبقى للخاص إذنه وسياسة تخزينه. لا تعطل أمان المتصفح أو توسع الجميع لإسكات الطرفية. لا يفوض التمهيد الفعل الحقيقي، ولا يثبت حجب الرد منع أثره. حافظ على وضوح عقد التطبيق للإعادة ومنع تكرار الأثر.
تحقق من نجاح الإصلاح
تحقق بمتصفح الاختبار المفوض من إتمام المهمة الشرعية للأصل المقصود، ومن الرفض المطلوب لأصل غير مدرج. افحص الاعتماد الفعلي والتفاوض على الطريقة والرؤوس وكشف الرد وإذن الخادم واختلاف المخبأ وثبات الحالة حيث يلزم للرفض. أكد أن فشل القراءة لا يطلق كتابة مكررة. سجل الإطار والمتصفح وافتراضات النشر؛ لا يثبت تحقق التوافق المحلي وحده أياً من هذه السلوكيات وقت التشغيل.
امنع تكرار المشكلة
- عين مالكاً لقائمة أصول دنيا، ووثق افتراضات الاعتماد وتاريخ التنقل والاستضافة، واختبر اختلاف الرد بعد تغير الوكيل أو الوسيط. افصل التمهيد وتفويض الأعمال وضوابط CSRF. احمِ التشخيص وتجنب الإعادة الآلية لكتابة مبهمة النتيجة. تعامل مع تحذير المتصفح كدليل على مرحلة معينة، لا مبرراً لمنح وصول واسع.