سؤال

هذا غريب, أنا أتساءل عما إذا كان أي شخص يمكن أن تلقي بعض الضوء على لماذا حدث هذا.

في الأساس, لقد تم سحب شعري يحاول اختبار JSONP حتى أستطيع تنفيذ سلمان خدمة ويب الأخرى التي يمكن أن تستخدم مواقع.أنا أفعل التنمية على localhost--على وجه التحديد ، 2008 Visual Studio و Visual Studio 2008 المدمج في خادم الويب.

وذلك JSONP اختبار تشغيل w/ مسج, لقد نفذت التالية:

$().ready(function() {
  debugger;
  try {
    $.getJSON("<%= new Uri(Request.Url, "/").ToString() %>XssTest?callback=?", function(data) {
        alert(data.abc);
    });
  } catch (err) {
    alert(err);
  }
});

و على الخادم ..

<%= Request["callback"] %>({abc : 'def'})

حتى ما ينتهي يحدث هو أنني تعيين نقطة توقف على الخادم و أحصل على نقطة على أول "المصحح;" المنصورة في البرنامج النصي من جانب العميل وكذلك على الملقم.على JSONP URL هو في الواقع يجري الاحتجاج بعد تحميل الصفحة.هذا عمل عظيم.

المشكلة كنت أعاني كان هذا الاستدعاء لن تنفذ.أنا اختبرت هذا في كل IE8 وكذلك فايرفوكس 3.5.لا أحد سوف تحتج رد.Catch(err) كانت لم تصل أيضا.لم يحدث شيء على الإطلاق!

لقد كان عالقة على هذا لمدة أسبوع ، وحتى اختبارها مع يدويا مرتبطا طلب HTTP في Telnet على المنفذ المحدد للتأكد من أن الملقم إعادة تنسيق...

callbackfn({abc : 'def'})

..و هو عليه.

ثم اتضح لي ما اذا كان يمكنني تغيير اسم المضيف من مضيف إلى مضيف مع globalizer ('.'), أنا.هـ http://localhost.:41559/ بدلا من http://localhost:41559/ (نعم, إضافة نقطة إلى أي اسم المضيف هو قانوني ، هو أن ما DNS global:: هو C# مساحات).وبعد ذلك عملت!إنترنت إكسبلورر وفايرفوكس 3.5 وأخيرا أظهر لي رسالة تنبيه عندما أنا فقط واضاف نقطة.

لذلك هذا يجعلني أتساءل ما الذي يجري هنا ؟ لماذا أواخر العلامة النصي جيل عمل مع إنترنت المضيف لا عادي localhost?أو هو أن حق السؤال ؟

ومن الواضح أن هذا هو تنفيذها لأسباب أمنية ، ولكن ما الذي يحاولون تأمين??ومن خلال الحصول على العمل مع نقطة, هل أنا فقط كشف ثغرة أمنية في الأمن هذه الميزة ؟

لدي ملف المضيفين ، في حين عدلت عن المضيفين الآخرين, لديه شيء خاص مع المضيف المحلي ؛ الافتراضي 127.0.0.1 / ::1 لا تزال في مكان لا يتجاوز أدناه.

متابعة: حصلت في الماضي هذا من أجل التنمية المحلية لأغراض بإضافة:

127.0.0.1   local.mysite.com

..إلى ملف hosts ثم إضافة التعليمة البرمجية التالية إلى العالمية.asax:

protected void Application_BeginRequest(object sender, EventArgs e)
{
    if (Request.Headers["Host"].Split(':')[0] == "localhost")
    {
        Response.Redirect(
            Request.Url.Scheme
            + "://"
            + "local.mysite.com"
            + ":" + Request.Url.Port.ToString()
            + Request.Url.PathAndQuery
            , true);
    }
}
هل كانت مفيدة؟

المحلول

انا ذاهب الى رمي جوابا هناك ؛ بعد بعض التفكير أني قد وصلت إلى استنتاجاته الخاصة.

يمكن أن يكون هذا هو ميزة الأمان التي نفذت في محاولة لمنع موقع على شبكة الإنترنت من الاحتجاج JSONP الخدمات قيد التشغيل على جهاز العميل.

موقع على شبكة الإنترنت يمكن أن تذهب فقط من خلال قائمة الموانئ والحفاظ على الاحتجاج localhost على منافذ مختلفة ومسارات.'Localhost' هي واحدة من عدد قليل من DNS أسماء المضيفين التي هي ديناميكية في المعنى اعتمادا على متى وأين هو الاستعلام ، مما يجعل الأهداف المحتملة الضعيفة.و نعم حقيقة أن إلحاق نقطة (.) أن 'localhost' ('localhost.') ينتج العامل الحل لا تعرض ثغرة أمنية ، ولكن لا تقدم [مؤقت] الحل من أجل التنمية puposes.

أفضل نهج هو الخريطة الاسترجاع IP إلى اسم المضيف الدخول في ملف المضيفين بحيث يعمل محليا ليست عرضة "ثابت" خلال تحديث المتصفح, و لا يعمل في أي مكان آخر ولكن على تطوير محطة العمل.

نصائح أخرى

أنا تعاني من مشكلة مماثلة.معظم الحلول حاولت العمل مع أي (7), ولكن أواجه صعوبة في الحصول على فايرفوكس (3.5.2) للعب الكرة.

لقد قمت بتثبيت HttpFox من أجل أن نرى كيف الخادم ردود يجري تفسيرها على العميل الحصول على NS_ERROR_DOM_BAD_URI.الوضع مختلف قليلا لك على الرغم من أنني أحاول أن الاحتجاج JSONP المكالمة مرة أخرى إلى نفس الموقع على استضافة الصفحة جاءت من ثم هذه الدعوة الاستجابة مع 302 توجيه إلى موقع آخر.(أنا باستخدام توجيه وسيلة مريحة للحصول على الكوكيز من كل من المجالات عاد إلى المتصفح.)

أنا باستخدام مسج, و أنا أصلا حاولت القيام القياسية اياكس الاتصال عبر $.اياكس().أنا أحسب أن الطلب الأولي هو نفس موقع استضافة صفحة فايرفوكس فقط اتبع 302 الاستجابة إلى مجال آخر.ولكن لا يبدو أن نقع ضحية XSS الدفاعات.(ملاحظة أنه على عكس ما العودة توجيه الاستجابة إلى طلب XHR يعني, مسج لا تتبع توجيه 302 قياسي نوع البيانات="سلمان" الدعوة:إعادة توجيه إلى نفس المجال يعمل بشكل جيد ؛ إعادة توجيه إلى مجال آخر يولد NS_ERROR_DOM_BAD_URI في المتصفح.) بوصفها جانبا, أنا لا أرى لماذا نفس المجال 302 الموجهات إلى مجالات أخرى لا يمكن فقط أن يتبع - بعد كل شيء, انها استضافة الصفحة هو المجال الذي يتم إصدار توجيه ، لذلك لماذا لا يمكن الوثوق بها ؟ إذا كنت قلقا حول البرمجة هجمات حقن ، ثم JSONP الطريق مفتوحة أمام الاعتداء على أي حال...

مسج دولار.getJSON() مع ?رد=?لاحقة أيضا فشل في فايرفوكس مع نفس الخطأ.وكذلك باستخدام $.getScript() لفة بلدي JSONP <script> tag.

ما لا يبدو أن العمل هو وجود موجود من قبل <script id="jsonp" type="text/javascript"></script> in the HTML and then using $("jsonp").attr("src", url + "?callback=myCallback") to invoke the JSONP call.إذا كنت تفعل ذلك عبر المجال توجيه 302 يتبع و حصلت على استجابة JSON تمريرها إلى myCallback (أنا الذي يعرف في نفس الوقت <script /> tag).

و, نعم, أنا النامية كل هذا باستخدام كاسيني مع localhost:ميناء عناوين url.كاسيني لن تستجيب غير localhost عناوين, لذلك لا أستطيع أن محاولة بسهولة local.mysite.com لمعرفة ما إذا كان لديه أي تأثير على الحلول حاولت أعلاه.بيد أن الخلاف نقطة في نهاية localhost يبدو أن إصلاح جميع المشاكل!

الآن يمكنني العودة إلى معيار $.ajax({ ...نوع البيانات:"jsonp" ...}) الاتصال مع مضيف__.__:ميناء بدلا من localhost:ميناء و كل شيء على ما يرام.أجد أنه من المثير للاهتمام أن تعديل سمة src علامة النصي ذلك مسبقا موجود في صفحة HTML لا تسمح العادية localhost عناوين التذرع - أعتقد بعد عملية التفكير الخاصة بك ، يمكن أن يكون هذا آخر ثغرة أمنية.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top