غالبًا ما يتطلب تطوير الويب مواجهة مشاكل في المجال. السبب الجذري لمشاكل النطاقات المتقاطعة هو استراتيجية الأرقام الأصلية في أمان المتصفح. على سبيل المثال ، لـ http://www.a.com/1.html:
1. http://www.a.com/2.html متماثل ؛
2. https://www.a.com/2.html من مصادر مختلفة ، لأن البروتوكول مختلف ؛
3. http://www.a.com:8080/2.html من مصادر مختلفة ، لأن المنافذ مختلفة ؛
4. http://sub.a.com/2.html من مصادر مختلفة لأن المضيفين مختلفون.
في المتصفح ، يمكن للعلامات <script> و <img> و <frame> و <link> تحميل الموارد المتقاطعة (غير المتجانسة) ، وطريقة التحميل تعادل في الواقع طلب الحصول على الحصول على GET عادي. الفرق الوحيد هو أنه من أجل الأمان ، لا يسمح المتصفح بعمليات القراءة والكتابة على الموارد المحملة بهذه الطريقة ، ولكن لا يمكنها إلا استخدام القدرات التي يجب أن يكون لها العلامة نفسها (مثل تنفيذ البرنامج النصي ، وتطبيق النمط ، وما إلى ذلك).
المشكلة الأكثر شيوعًا في المجال المتقاطع هي مشكلة الوصول إلى المجال المتقاطع في Ajax. بشكل افتراضي ، لا يمكن الوصول إلى عناوين URL للمجال عبر Ajax. هنا أسجل ما تعلمته عن أساليب المجال المتقاطع:
1. وكيل من جانب الخادم ، لا يوجد شيء يمكن قوله. العيب هو أنه بشكل افتراضي ، لا يمكن للخادم الذي يتلقى طلبات AJAX الحصول على IP و UA للعميل.
2. iframe ، فإن استخدام iframe يعادل فعليًا فتح صفحة ويب جديدة. إن طريقة المجال المتقاطع المحددة هي تقريبًا الصفحة الأصل التي يتم فتحها بواسطة المجال A Dens a iframe يشير إلى المجال B ، ثم يقدم البيانات. بعد الانتهاء ، يمكن لخادم B:
● إرجاع استجابة إعادة توجيه 302 وأوجه النتيجة مرة أخرى إلى المجال A ؛
● عش الإطارات الإطارية تشير إلى المجال A داخل هذا iframe.
كلاهما ينفذون أخيرًا مكالمات عبر المجال. هذه الطريقة أقوى وظيفيًا من JSONP المقدمة أدناه ، لأنه بعد الانتهاء من المجال المتقاطع ، لا توجد مشكلة في عمليات DOM ومكالمات JavaScript بين بعضها البعض ، ولكن هناك بعض القيود ، مثل النتيجة التي يتم تمريرها في معلمات URL ، مما يعني أنه عندما تكون بيانات النتيجة كبيرة ، يجب أن يتم تمريرها في القطعة ، وهو أمر غير ضار للغاية ؛ هناك مشكلة أخرى ناتجة عن iFrame نفسه ، والتفاعل بين الصفحة الأصل والمعفارة الدولية نفسه له قيود أمنية.
3. استخدم علامات البرنامج النصي إلى المجال المتبادل ، هذه الطريقة شائعة جدًا أيضًا. يمكن لعلامات البرنامج النصي تحميل JavaScript الأجنبية وتنفيذها. يمكن أن تدرك وظيفة رد الاتصال مسبقًا التفاعل مع الصفحة الأصل. إنه له اسم كبير بعنوان JSONP عبر المجال ، وهو اختصار لـ JSON مع الحشو. إنه بروتوكول غير رسمي ، والذي من الواضح أنه يتم تحميل البرنامج النصي ، فلماذا يرتبط بـ JSON؟ اتضح أنها وظيفة رد الاتصال هذه. هناك طريقة نموذجية لاستخدامه ، وهي تمرير المعلمات عبر JSON ، أي ملء بيانات JSON في وظيفة رد الاتصال. هذا هو معنى JSONP's JSON+Padding.
هناك العديد من خدمات JSONP على الإنترنت لتقديم البيانات. في جوهرها ، فهي طلبات عبر المجال وتحديد عمليات الاسترجاعات في عنوان URL للطلب ، مثل رد الاتصال = النتيجة. بعد الحصول على هذه البيانات ، سيتم استدعاء وظيفة النتيجة تلقائيًا وسيتم تمرير البيانات في شكل JSON ، على سبيل المثال (البحث عن "كرة القدم"):
http://ajax.googleapis.com/ajax/services/search/web=1.0&q=football&callback=result
استخدم jQuery للاتصال بها واكتبها على النحو التالي:
نسخة الكود كما يلي:
$ .getjson ("http://ajax.googleapis.com/ajax/services/search/web=1.0&q=football&callback=؟" ، وظيفة (بيانات) {
// ...
}) ؛
بشكل عام ، فإن الحد من نهج JSONP المتقاطع هو أنه لا يمكنه استخدام الطلبات إلا ولا يمكن حل مشكلة كيفية إجراء مكالمات JavaScript بين صفحتين في مجالات مختلفة.
4.
سيصل إلى ملف CrossDomain.xml ضمن الدليل الجذر لموقع الويب الهدف ، وتحديد ما إذا كان سيتم السماح لهذا الوصول عبر المجال بناءً على المحتوى في الملف:
نسخة الكود كما يلي:
<السياسة عبر المجال>
<almation-access-from domain = "xxx.xxx.com" />
</cross-omain-policy>
5. يمكن أيضًا استخدام علامة IMG ، وهي أيضًا طريقة شائعة جدًا. لها وظيفة أضعف ويمكن فقط إرسال طلب الحصول على الحصول على أي عمليات الاسترجاعات. هذه هي الطريقة التي يتم بها تحديد عدد نقرات Google.
6. Window.PostMessage ، وهي آلية مضافة حديثًا للتواصل عبر المجال ، يتم دعمها فقط بواسطة Firefox 3 و Safari 4 و IE8 والإصدارات الأحدث. المكالمة لاستخدامها لإرسال الرسائل إلى النوافذ الأخرى هي كما يلي:
نسخة الكود كما يلي:
otherwindow.postmessage (رسالة ، Targetorigin) ؛
في نافذة الاستلام ، يجب تعيين معالج الأحداث لتلقي الرسائل المرسلة:
نسخة الكود كما يلي:
Window.AdDeventListener ("Message" ، receivemessage ، false) ؛
وظيفة receivemessage (الحدث) {
if (event.orgin! == "http://example.org:8080")
يعود؛
}
لاحظ أنه يجب استخدام سمات الأصل والموزع للرسالة للتحقق من هوية المرسل ، وإلا فإنه سيؤدي إلى نقاط الضعف XSS.
7. السيطرة على الوصول
بعض المتصفحات تدعم رؤوس الاستجابة مثل Access-Control-Caller-arigin ، مثل:
نسخة الكود كما يلي:
header ("Access-Control-allow-Origin: http://www.a.com") ؛
هذا يحدد أن الوصول عبر المجال إلى www.a.com مسموح به.
8. Window.name
تم استخدام هذا الشيء في الواقع كوسيلة لاختراق XSS. الجوهر هو أنه عندما يتغير موقع النافذة ، سيتم إعادة تحميل الصفحة ، ولكن من المثير للاهتمام ، أن النافذة. اسم لا يتغير ، حتى تتمكن من استخدامها لتمرير القيمة. مع iframe ، قم بتغيير كائن نافذة iframe عدة مرات ، ويتم الانتهاء من نقل بيانات المجال المتقاطع العملي.
9. document.domain
هذه الطريقة مناسبة للاتصال عبر المجال مثل A.Example.com و B.Example.com ، لأن الاثنين لديهما مجال مشترك يسمى example.com. فقط قم بتعيين document.domain على example.com ، ولكن إذا كنت ترغب في التواصل بين A.Example1.com و B.Example2.com ، فليس لها خيار.
10. مراسلة التعريف الشظية (FIM)
هذه الطريقة مثيرة للاهتمام للغاية وتتطلب تعاون مع iframes. التعرف على الأجزاء هو الجزء الذي يتم استخدامه غالبًا لتحديد المواقع بعد علامة جنيه عنوان URL (#). التغييرات في هذا الجزء لن تتسبب في تحديث الصفحة. يمكن للنافذة الأنثوية الوصول إلى عنوان URL الخاص بـ IFRAME في الإرادة ، ويمكن أن يصل IFRAME أيضًا إلى عنوان URL للنافذة الأنثوية. ثم يمكن تحقيق التواصل عن طريق تغيير معرف Fragmement. العيب هو أن التغييرات في التعرف على الشظايا ستولد تاريخًا غير ضروري ولديها قيود الطول ؛ بالإضافة إلى ذلك ، لا تدعم بعض المتصفحات حدث onhashchange.
11. إطار متقاطع (راجع)
هذه الطريقة هي البديل لطريقة FIM أعلاه. يتم تقديم جوهر CF و FIM فعليًا في مقالتي "GWT First Experience" (يتم استخدامه فقط لتنفيذ التاريخ والوظائف المتخلفة). سيخلق ديناميكيًا إيفراميًا غير مرئي ، مشيرًا إلى مجال أجنبي. بعد المعالجة ، يحتوي التعريف الشظية في عنوان URL لهذا IFRAME على نتائج المعالجة للوصول إلى الصفحة الأصل ، في حين أن عنوان URL للمتصفح لا يحتوي على أي تغييرات.
12. ملف تعريف الارتباط+بروتوكول P3P
يعد استخدام خصائص ملفات تعريف الارتباط عبر المجال عبر بروتوكول P3P لتحقيق الوصول عبر المجال أيضًا خدعة غريبة. P3P هو معيار توصية حماية الخصوصية الصادرة عن W3C ، بهدف توفير حماية الخصوصية لمستخدمي الإنترنت الذين يتصفحون الإنترنت. اضبط مسار ملف تعريف الارتباط على "/" ، أي أنه لا يوجد تقييد للمجال. في هذا الوقت ، تتيح بعض المتصفحات قراءة صفحات عناوين URL الأخرى ، بينما لا يفعل ذلك الآخر. في هذه الحالة ، يجب تعيين رأس P3P على رأس استجابة الصفحة الأصل:
نسخة الكود كما يلي:
P3P: cp = "cura adda deva psao psdo bus uni pur int dem sta pre com nav otc noi dsp cor"