facebook - لا يتم إغلاق مربع حوار FB.login على Google Chrome





google-chrome (6)


لدي تماما نفس المشكلة. فعلت شيئين ، أولاً أضفت هذا الخط مباشرة قبل استدعاء FB.init() :

FB.Flash.hasMinVersion = function () { return false; };

ثم انتقلت إلى صفحة تطبيق FB وأضفت نطاق الموقع (على سبيل المثال test.com).

أعتقد أن إعداد نطاق الموقع هو المفتاح ، ولكني لست إيجابيًا بنسبة 100٪. كل ما أعرفه هو أنه يبدو أنه مغلق دائمًا الآن في جميع المتصفحات بما في ذلك Chrome.

أتصل بـ FB.login() على حدث نقرة في طلبي. يظهر مربع الحوار كما هو متوقع ، ولكن عندما ينتهي المستخدم من تسجيل الدخول إلى Facebook (و / أو تفويض التطبيق) ، لا يتم إغلاق مربع الحوار. بدلاً من ذلك ، يتم تحميل صفحة بيضاء (داخل مربع الحوار) ويتغير العنوان إلى وكيل XD .

يحدث هذا فقط على Google Chrome (أستخدم أحدث إصدار متاح حاليًا لنظام التشغيل Windows 7).

لا يحدث هذا إذا كان Chrome في وضع التصفح المتخفي.

يعمل المكون الإضافي الاجتماعي "fb-login" جيدًا على Chrome.

لاختبار / تصحيح هذا الأمر ، قمت بإنشاء تطبيق Facebook جديد باستخدام إعدادات الفانيلا. التغيير الوحيد الذي قمت به هو تعيين عنوان URL الخاص بالموقع في إعدادات التطبيق. فيما يلي تعليمات HTML البرمجية التي يمكنك استخدامها لإعادة إنشاء هذا الخطأ.

كود عينة لإعادة القضية

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>Chrome Bug Test</title>
    </head>
    <body>
        <button onclick="dologin()">Login using Facebook</button>

        <div id="fb-root"></div>
        <script src="http://connect.facebook.net/en_US/all.js"></script>
        <script>
          FB.init({
            appId  : '[YOUR APP ID HERE]',
            status : true, // check login status
            cookie : true, // enable cookies to allow the server to access the session
            xfbml  : true  // parse XFBML
          });
        </script>

        <script type="text/javascript">
            function dologin(){
                FB.login(function(r){
                    if(console && console.log) {
                        console.log(r);
                    }
                });
            }
        </script>

    </body>
</html>

إعدادات Facebook التي حاولت تغييرها

  1. تعيين نطاق الموقع ، لم يغير أي شيء.
  2. لم يساعد استخدام ملف channelUrl وملف قناة مخصصين أيضًا.

الأخطاء ذات الصلة التي تم تتبعها على Facebook

المشكلات ذات الصلة هنا على

لقد رأيت الكثير من الناس يتعرفون على هذا ، لكن ما يزعجني هو أنني لم أتمكن من إيجاد حل ملموس لهذا الأمر. لم يستجب Facebook لتقارير الأخطاء حتى الآن. أحد الحلول هو التخلص من شفرة التوثيق المبنية على جافا سكريبت والقيام بذلك فقط باستخدام آلية سيرفيديسايد (Facebook PHP SDK). أود تجنب ذلك بسبب ضيق الوقت.

هل يملك أي أحد فكرة كيف يمكن اصلاح هذا؟




لقد واجهت نفس المشكلة في IE9 ، ويبدو أنها تنبع من الترقية إلى Flash Player 10. الإجابات المقترحة لم تنجح بالفعل بالنسبة لي وفقدت الأمل في محاولة إصلاحها منذ العثور على http://bugs.developers.facebook.net/show_bug.cgi?id=12112 تغطيها. لكن Henson نشر إجابة عن سؤال مماثل صممه لي. في جافا سكريبت في موقعي الرئيسي ، قمت بإزالة هذه السطور

    FB.UIServer.setLoadedNode = function (a, b) {
       //HACK: http://bugs.developers.facebook.net/show_bug.cgi?id=20168
        FB.UIServer._loadedNodes[a.id] = b;
    };

والآن يعمل. (ملاحظة: لم أتحقق مما إذا كانت مشكلة IE8 تهدف إلى التغلب على العوائد.)




استدعاء هذا المقتطف بعد FB.init إصلاح المشكلة بالنسبة لي. لكن يبدو أن الحلول الأخرى عملت في حالات مختلفة.

$.browser.chrome = /chrome/.test(navigator.userAgent.toLowerCase());
if ($.browser.chrome || $.browser.msie) {
    FB.XD._origin = window.location.protocol + "//" + document.domain + "/" + FB.guid();
    FB.XD.Flash.init();
    FB.XD._transport = "flash";
  } else if ($.browser.opera) {
    FB.XD._transport = "fragment";
    FB.XD.Fragment._channelUrl = window.location.protocol + "//" + window.location.host + "/";
  }



بالنظر إلى عمر هذا المنشور ، أظن أن الملصق قد حل هذا ؛ ومع ذلك ، نظرًا لأن هذا يعد أيضًا موردًا للآخرين الذين يبحثون عن حل مشكلات مماثلة ، فقد اعتقدت أنني سأدرج تجربتي في حالتها فقط.

اكتشفت أن ما تسبب في عرض المشكلة نفسه بالنسبة لي هو نسيان بطريق الخطأ تضمين event.preventDefault(); في معالج المستمع "انقر" في jQuery. كان مربع حوار تسجيل الدخول في facebook يظهر ويسمح لي بتسجيل الدخول ولكن لا يختفي. كانت المشكلة هي أن موقع الويب كان يقوم بإجراء ما بعد التصرف الافتراضي ، والذي كان يتداخل مع وظيفة معاودة الاتصال من فيس بوك.




إجابة مختصرة عن السؤال أعلاه:

تحميل البرنامج النصي all.js عبر https .

<script src="https://connect.facebook.net/en_US/all.js"></script>

إجابة أطول إذا كنت تقوم باستكشاف مشكلة مشابهة للسؤال الأصلي:

استخدم Google Chrome لمحاولة تسجيل الدخول. بمجرد تسجيل الدخول وإغلاق النافذة المنبثقة الفارغة على الشاشة ، اضغط F12 . يؤدي ذلك إلى إظهار أدوات مطوّري البرامج لمتصفح Chrome. انقر فوق علامة التبويب وحدة التحكم ، ونأمل أن ترى الخطأ. ما سترونه على الأرجح يتعلق بقضايا XD (عبر النطاقات).

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

كانت مشكلتي / الحل الخاص بي وثائق V6 SDK الخاصة بـ Facebook C # - يقوم البرنامج التعليمي بتحميل البرنامج النصي all.js باستخدام عنوان URL يبدأ بـ // - ثم يقوم بتحميل البرنامج النصي من نفس مخطط موقعي (الذي كان http). بعد تسجيل الدخول ، حاولت النافذة المنبثقة إعادة توجيهي من https تسجيل الدخول إلى موقع الويب الخاص بي و bingo ، لدينا قضية XD. كان الحل هو تحميل البرامج النصية على وجه التحديد من https://connect.facebook.net/en_US/all.js كما يلي:

  // Load the SDK Asynchronously
  (function(d){
     var js, id = 'facebook-jssdk', ref = d.getElementsByTagName('script')[0];
     if (d.getElementById(id)) {return;}
     js = d.createElement('script'); js.id = id; js.async = true;
     js.src = "https://connect.facebook.net/en_US/all.js";
     ref.parentNode.insertBefore(js, ref);
   }(document));

تصحيح:

بعد بعض الاعتبارات ، قد يؤدي هذا النهج في السماح بإعادة التوجيه إلى http إلى الإضرار بأمن النظام من خلال السماح للبيانات الموجودة في هذا الطلب بقراءة من قبل شخص آخر ثم إعادة استخدامها. لم أتمكن من العثور على أي وثائق أو أمثلة ذات صلة ، وبالتالي لم أستطع أن أختتم بطريقة أو بأخرى ، YMMV.




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

أفضل أداة حتى الآن حسب معرفتي هي إضافة ملفات جافا سكريبت متعددة تقوم ببساطة بتغيير تكامل الصفحة إلى وضعها الطبيعي عن طريق تحديث أو استبدال المحتوى. لن يكون تعطيل أداة المطور هذه هو الفكرة المثلى لأن التجاوز دائمًا ما يكون موضع شك حيث أن الشفرة جزء من المتصفح وليست عرضًا للخادم ، وبالتالي يمكن تشققها.

إذا كان لديك js file one فحصًا js file one لـ <element> التغييرات على العناصر المهمة js file two js file three يتأكدان من وجود هذا الملف في كل فترة فسيكون لديك استعادة كاملة للنزاهة على الصفحة خلال الفترة.

لنأخذ مثالاً على الملفات الأربعة ونعرض لك ما أقصده.

index.html و

   <!DOCTYPE html>
   <html>
   <head id="mainhead">
   <script src="ks.js" id="ksjs"></script>
   <script src="mainfile.js" id="mainjs"></script>
   <link rel="stylesheet" href="style.css" id="style">
   <meta id="meta1" name="description" content="Proper mitigation against script kiddies via Javascript" >
   </head>
   <body>
   <h1 id="heading" name="dontdel" value="2">Delete this from console and it will refresh. If you change the name attribute in this it will also refresh. This is mitigating an attack on attribute change via console to exploit vulnerabilities. You can even try and change the value attribute from 2 to anything you like. If This script says it is 2 it should be 2 or it will refresh. </h1>
   <h3>Deleting this wont refresh the page due to it having no integrity check on it</h3>

   <p>You can also add this type of error checking on meta tags and add one script out of the head tag to check for changes in the head tag. You can add many js files to ensure an attacker cannot delete all in the second it takes to refresh. Be creative and make this your own as your website needs it. 
   </p>

   <p>This is not the end of it since we can still enter any tag to load anything from everywhere (Dependent on headers etc) but we want to prevent the important ones like an override in meta tags that load headers. The console is designed to edit html but that could add potential html that is dangerous. You should not be able to enter any meta tags into this document unless it is as specified by the ks.js file as permissable. <br>This is not only possible with meta tags but you can do this for important tags like input and script. This is not a replacement for headers!!! Add your headers aswell and protect them with this method.</p>
   </body>
   <script src="ps.js" id="psjs"></script>
   </html>

mainfile.js

   setInterval(function() {
   // check for existence of other scripts. This part will go in all other files to check for this file aswell. 
   var ksExists = document.getElementById("ksjs"); 
   if(ksExists) {
   }else{ location.reload();};

   var psExists = document.getElementById("psjs");
   if(psExists) {
   }else{ location.reload();};

   var styleExists = document.getElementById("style");
   if(styleExists) {
   }else{ location.reload();};


   }, 1 * 1000); // 1 * 1000 milsec

ps.js

   /*This script checks if mainjs exists as an element. If main js is not existent as an id in the html file reload!You can add this to all js files to ensure that your page integrity is perfect every second. If the page integrity is bad it reloads the page automatically and the process is restarted. This will blind an attacker as he has one second to disable every javascript file in your system which is impossible.

   */

   setInterval(function() {
   // check for existence of other scripts. This part will go in all other files to check for this file aswell. 
   var mainExists = document.getElementById("mainjs"); 
   if(mainExists) {
   }else{ location.reload();};

   //check that heading with id exists and name tag is dontdel.
   var headingExists = document.getElementById("heading"); 
   if(headingExists) {
   }else{ location.reload();};
   var integrityHeading = headingExists.getAttribute('name');
   if(integrityHeading == 'dontdel') {
   }else{ location.reload();};
   var integrity2Heading = headingExists.getAttribute('value');
   if(integrity2Heading == '2') {
   }else{ location.reload();};
   //check that all meta tags stay there
   var meta1Exists = document.getElementById("meta1"); 
   if(meta1Exists) {
   }else{ location.reload();};

   var headExists = document.getElementById("mainhead"); 
   if(headExists) {
   }else{ location.reload();};

   }, 1 * 1000); // 1 * 1000 milsec

ks.js

   /*This script checks if mainjs exists as an element. If main js is not existent as an id in the html file reload! You can add this to all js files to ensure that your page integrity is perfect every second. If the page integrity is bad it reloads the page automatically and the process is restarted. This will blind an attacker as he has one second to disable every javascript file in your system which is impossible.

   */

   setInterval(function() {
   // check for existence of other scripts. This part will go in all other files to check for this file aswell. 
   var mainExists = document.getElementById("mainjs"); 
   if(mainExists) {
   }else{ location.reload();};
   //Check meta tag 1 for content changes. meta1 will always be 0. This you do for each meta on the page to ensure content credibility. No one will change a meta and get away with it. Addition of a meta in spot 10, say a meta after the id="meta10" should also be covered as below.
   var x = document.getElementsByTagName("meta")[0];
   var p = x.getAttribute("name");
   var s = x.getAttribute("content");
   if (p != 'description') {
   location.reload();
   }
   if ( s != 'Proper mitigation against script kiddies via Javascript') {
   location.reload();
   }
   // This will prevent a meta tag after this meta tag @ id="meta1". This prevents new meta tags from being added to your pages. This can be used for scripts or any tag you feel is needed to do integrity check on like inputs and scripts. (Yet again. It is not a replacement for headers to be added. Add your headers aswell!)
   var lastMeta = document.getElementsByTagName("meta")[1];
   if (lastMeta) {
   location.reload();
   }
   }, 1 * 1000); // 1 * 1000 milsec

style.css

الآن هذا فقط لإظهار أنه يعمل على جميع الملفات والعلامات أيضا

   #heading {
   background-color:red;
   }

إذا وضعت كل هذه الملفات معًا وقمت ببناء المثال ، فسوف ترى وظيفة هذا المقياس. سيؤدي ذلك إلى منع بعض الحقن غير المنضبطة إذا قمت بتنفيذها بشكل صحيح على جميع العناصر الهامة في ملف الفهرس خاصة عند العمل مع PHP.

لماذا اخترت إعادة التحميل بدلاً من التغيير إلى القيمة العادية لكل سمة هي حقيقة أن بعض المهاجمين يمكن أن يكون لديهم جزء آخر من موقع الويب الذي تمت تهيئته وجاهزًا له ، وأنه يقلل من مقدار الشفرة. سيؤدي التحميل إلى إزالة جميع المهام الشاقة للمهاجم ، ومن المحتمل أنه سيذهب للعب في مكان ما أسهل.

ملاحظة أخرى: قد يتحول هذا إلى الكثير من الشفرات ، لذا حافظ على نظافته وتأكد من إضافة تعريفات إلى المكان الذي ينتمون إليه لجعل التعديلات سهلة في المستقبل. عيّن أيضًا الثواني لمبلغك المفضل حيث أن الفواصل الزمنية الثانية في الصفحات الكبيرة قد يكون لها تأثيرات جذرية على أجهزة الكمبيوتر القديمة التي ربما يستخدمها الزوار





facebook google-chrome login