javascript फ्रेम बस्टर बस्टर... बस्टर कोड की आवश्यकता है




html iframe (16)

यदि आप setInterval() द्वारा दिए गए मानों को देखते हैं तो वे आमतौर पर एकल अंक होते हैं, इसलिए आप आमतौर पर कोड की एक पंक्ति के साथ ऐसे सभी इंटरप्ट को अक्षम कर सकते हैं:

for (var j = 0 ; j < 256 ; ++j) clearInterval(j)

आइए मान लें कि आप नहीं चाहते हैं कि अन्य साइटें आपकी साइट को " <iframe> में" फ्रेम करें ":

<iframe src="http://example.org"></iframe>

तो आप अपने सभी पृष्ठों में एंटी-फ़्रेमिंग, फ़्रेम बस्टिंग जावास्क्रिप्ट डालें:

/* break us out of any containing iframes */
if (top != self) { top.location.replace(self.location.href); }

अति उत्कृष्ट! अब आप स्वचालित रूप से किसी भी युक्त आईफ्रेम से "बस्ट" या ब्रेक आउट हो जाते हैं। एक छोटी सी समस्या के अलावा।

जैसा कि यह पता चला है, आपके फ्रेम-बस्टिंग कोड को यहां दिखाया जा सकता है , जैसा कि यहां दिखाया गया है :

<script type="text/javascript">
    var prevent_bust = 0  
    window.onbeforeunload = function() { prevent_bust++ }  
    setInterval(function() {  
      if (prevent_bust > 0) {  
        prevent_bust -= 2  
        window.top.location = 'http://example.org/page-which-responds-with-204'  
      }  
    }, 1)  
</script>

यह कोड निम्न कार्य करता है:

  • जब भी ब्राउजर वर्तमान पृष्ठ से window.onbeforeunload पर जाकर, नेविगेट करने का प्रयास करता है तो काउंटर में वृद्धि होती है window.onbeforeunload इवेंट हैंडलर
  • एक टाइमर सेट करता है जो प्रत्येक मिलीसेकंड को setInterval() माध्यम से चलाता है, और यदि यह काउंटर को बढ़ाता है, तो वर्तमान स्थान को हमलावर के नियंत्रण के सर्वर पर बदलता है
  • वह सर्वर HTTP स्थिति कोड 204 वाला एक पृष्ठ प्रस्तुत करता है, जो ब्राउज़र को कहीं भी नेविगेट करने का कारण नहीं बनाता है

मेरा सवाल है - और यह एक वास्तविक समस्या की तुलना में एक जावास्क्रिप्ट पहेली है - आप फ्रेम-बस्टिंग बस्टर को कैसे पराजित कर सकते हैं?

मेरे पास कुछ विचार थे, लेकिन मेरे परीक्षण में कुछ भी नहीं हुआ:

  • onbeforeunload = null माध्यम से onbeforeunload = null घटना को साफ़ करने का प्रयास कोई प्रभाव नहीं पड़ा
  • एक alert() जोड़कर alert() ने इस प्रक्रिया को रोक दिया ताकि उपयोगकर्ता को यह पता चल सके कि यह हो रहा था, लेकिन किसी भी तरह से कोड में हस्तक्षेप नहीं किया; ठीक क्लिक करने से बस्टिंग सामान्य के रूप में जारी रहती है
  • मैं setInterval() टाइमर को साफ़ करने के किसी भी तरीके से नहीं सोच सकता

मैं एक जावास्क्रिप्ट प्रोग्रामर नहीं हूं, इसलिए यहां मेरी चुनौती है: हे बस्टर, क्या आप फ्रेम-बस्टिंग बस्टर को बस्ट कर सकते हैं?


एफडब्ल्यूआईडब्लू, अधिकांश मौजूदा ब्राउज़र एक्स-फ्रेम-विकल्प का support करते हैं: निर्देश से इनकार करते हैं , जो स्क्रिप्ट अक्षम होने पर भी काम करता है।

IE8:
http://blogs.msdn.com/ie/archive/2009/01/27/ie8-security-part-vii-clickjacking-defenses.aspx

फ़ायरफ़ॉक्स (3.6.9)
https://bugzilla.mozilla.org/show_bug.cgi?id=475530
https://developer.mozilla.org/en/The_X-FRAME-OPTIONS_response_header

क्रोम / वेबकिट
http://blog.chromium.org/2010/01/security-in-depth-new-security-features.html
http://trac.webkit.org/changeset/42333


सभी प्रस्तावित समाधान सीधे शीर्ष विंडो के स्थान में बदलाव को मजबूर करते हैं। क्या होगा यदि कोई उपयोगकर्ता फ्रेम चाहता है? उदाहरण के लिए खोज इंजन के छवि परिणामों में शीर्ष फ्रेम।

मैंने एक प्रोटोटाइप लिखा जहां डिफ़ॉल्ट रूप से सभी इनपुट (लिंक, फॉर्म और इनपुट तत्व) अक्षम होते हैं और / या सक्रिय होने पर कुछ भी नहीं करते हैं।

यदि एक युक्त फ्रेम का पता चला है, तो इनपुट अक्षम कर दिया गया है और पृष्ठ के शीर्ष पर एक चेतावनी संदेश दिखाया गया है। चेतावनी संदेश में एक लिंक होता है जो पृष्ठ की एक सुरक्षित विंडो को एक नई विंडो में खुलता है। यह पृष्ठ को क्लिकजैकिंग के लिए उपयोग करने से रोकता है, जबकि उपयोगकर्ता को अन्य परिस्थितियों में सामग्री को देखने की अनुमति देता है।

यदि कोई फ्रेम शामिल नहीं है, तो इनपुट सक्षम हैं।

कोड यहाँ है। आपको मानक HTML गुणों को सुरक्षित मानों पर सेट करने और वास्तविक मान वाले एडिटोनल विशेषताओं को जोड़ने की आवश्यकता है। यह शायद अपूर्ण है और पूर्ण सुरक्षा के लिए अतिरिक्त विशेषताओं (मैं ईवेंट हैंडलर के बारे में सोच रहा हूं) शायद उसी तरह से व्यवहार किया जाना चाहिए:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<html>
  <head>
    <title></title>
    <script><!--
      function replaceAttributeValuesWithActualOnes( array, attributeName, actualValueAttributeName, additionalProcessor ) {
        for ( var elementIndex = 0; elementIndex < array.length; elementIndex += 1 ) {
          var element = array[ elementIndex ];
          var actualValue = element.getAttribute( actualValueAttributeName );
          if ( actualValue != null ) {
            element[ attributeName ] = actualValue;
          }

          if ( additionalProcessor != null ) {
            additionalProcessor( element );
          }
        }
      }

      function detectFraming() {
        if ( top != self ) {
          document.getElementById( "framingWarning" ).style.display = "block";
        } else {
          replaceAttributeValuesWithActualOnes( document.links, "href", "acme:href" );

          replaceAttributeValuesWithActualOnes( document.forms, "action", "acme:action", function ( form ) {
            replaceAttributeValuesWithActualOnes( form.elements, "disabled", "acme:disabled" );
          });
        }
      }
      // -->
    </script>
  </head>
  <body onload="detectFraming()">
    <div id="framingWarning" style="display: none; border-style: solid; border-width: 4px; border-color: #F00; padding: 6px; background-color: #FFF; color: #F00;">
      <div>
        <b>SECURITY WARNING</b>: Acme App is displayed inside another page.
        To make sure your data is safe this page has been disabled.<br>
        <a href="framing-detection.html" target="_blank" style="color: #090">Continue working safely in a new tab/window</a>
      </div>
    </div>
    <p>
      Content. <a href="#" acme:href="javascript:window.alert( 'Action performed' );">Do something</a>
    </p>
    <form name="acmeForm" action="#" acme:action="real-action.html">
      <p>Name: <input type="text" name="name" value="" disabled="disabled" acme:disabled=""></p>
      <p><input type="submit" name="save" value="Save" disabled="disabled" acme:disabled=""></p>
    </form>
  </body>
</html>

setInterval और setTimeout स्वचालित रूप से बढ़ते अंतराल को बनाते हैं। प्रत्येक बार सेटटाइमआउट या सेट इंटरवल को कॉल किया जाता है, यह संख्या एक से ऊपर जाती है, ताकि अगर आप सेटटाइमआउट को कॉल करते हैं, तो आपको वर्तमान, उच्चतम मूल्य मिल जाएगा।

   var currentInterval = 10000;
   currentInterval += setTimeout( gotoHREF, 100 );
   for( var i = 0; i < currentInterval; i++ ) top.clearInterval( i );
   // Include setTimeout to avoid recursive functions.
   for( i = 0; i < currentInterval; i++ )     top.clearTimeout( i );

   function gotoHREF(){
           top.location.href = "http://your.url.here";
   }

चूंकि यह लगभग 10000 एक साथ सेटइंटरवल्स और सेटटाइमआउट काम करने के लिए लगभग अनसुना है, और चूंकि सेटटाइमआउट "आखिरी अंतराल या टाइमआउट बनाया गया + 1" देता है, और शीर्ष के बाद से। स्कार्टर इंटरवल अभी भी सुलभ है, इससे ब्लैक-टोपी हमले फ्रेम पर हार जाएंगे ऊपर वर्णित वेबसाइटें।


मुझे यकीन नहीं है कि यह व्यवहार्य है या नहीं - लेकिन यदि आप फ्रेम तोड़ नहीं सकते हैं, तो क्यों न केवल चेतावनी प्रदर्शित करें। उदाहरण के लिए, यदि आपका पृष्ठ "शीर्ष पृष्ठ" नहीं है, तो एक फ्रेम अंतराल विधि बनाएं जो फ्रेम को तोड़ने का प्रयास करे। यदि 3 या 4 के बाद आपका पृष्ठ अभी भी शीर्ष पृष्ठ नहीं है - एक div तत्व बनाएं जो पूरे पृष्ठ (मोडल बॉक्स) को एक संदेश और एक लिंक के साथ कवर करता है ...

आप इस पृष्ठ को एक अनधिकृत फ्रेम विंडो में देख रहे हैं - (ब्ला ब्ला ... संभावित सुरक्षा समस्या)

इस समस्या को ठीक करने के लिए इस लिंक पर क्लिक करें

सबसे अच्छा नहीं, लेकिन मुझे कोई रास्ता नहीं दिखता है कि वे उस तरीके से अपना रास्ता स्क्रिप्ट कर सकते हैं।


खैर, आप काउंटर के मूल्य को संशोधित कर सकते हैं, लेकिन यह स्पष्ट रूप से एक भंगुर समाधान है। यह निर्धारित करने के बाद कि आप एक फ्रेम के भीतर नहीं है, यह भी एक अच्छा समाधान नहीं है, लेकिन यह उम्मीद है कि पहले से लोड करने की घटना (मैं मान रहा हूं) पर गोलीबारी से बचने के बाद आप AJAX के माध्यम से अपनी सामग्री लोड कर सकते हैं।

संपादित करें: एक और विचार। यदि आप पाते हैं कि आप एक फ्रेम में हैं, तो उपयोगकर्ता को वांछित यूआरएल पर ले जाने वाले लिंक पर क्लिक करने से पहले जावास्क्रिप्ट को अक्षम करने के लिए कहें (एक क्वेरीस्ट्रिंग पास करना जिससे आपके पृष्ठ को उपयोगकर्ता को यह बताना होगा कि वे एक बार जावास्क्रिप्ट को फिर से सक्षम कर सकते हैं वहां हैं)।

संपादित करें 2: परमाणु पर जाएं - यदि आप पाते हैं कि आप एक फ्रेम में हैं, तो बस अपने दस्तावेज़ शरीर की सामग्री हटाएं और कुछ बुरा संदेश प्रिंट करें।

संपादित करें 3: क्या आप शीर्ष दस्तावेज़ का आकलन कर सकते हैं और सभी कार्यों को शून्य (यहां तक ​​कि अज्ञात भी) सेट कर सकते हैं?


थोड़ी देर के लिए इस पर विचार करने के बाद, मुझे विश्वास है कि यह उन्हें दिखाएगा कि मालिक कौन है ...

if(top != self) {
  window.open(location.href, '_top');
}

window.open() लिए लक्ष्य पैरामीटर के रूप में _top का उपयोग करके इसे उसी विंडो में लॉन्च किया जाएगा।


मुझे लगता है कि आप लगभग वहां थे। आपने कोशिश की है:

window.parent.onbeforeunload = null;
window.parent.location.replace(self.location.href);

या, वैकल्पिक रूप से:

window.parent.prevent_bust = 0;

नोट: मैंने वास्तव में इसका परीक्षण नहीं किया था।


यदि आप बस्टर कोड के बाद एक अलर्ट जोड़ते हैं, तो अलर्ट जावास्क्रिप्ट थ्रेड को रोक देगा, और यह पेज लोड होने देगा। स्टैक ओवरफ्लो करता है, और यह मेरे आईफ्रेम से बाहर हो जाता है, भले ही मैं फ्रेम बस्टिंग बस्टर का उपयोग करता हूं। यह मेरे सरल परीक्षण पृष्ठ के साथ भी काम करता है। इसका परीक्षण केवल विंडोज़ पर फ़ायरफ़ॉक्स 3.5 और आई 7 में किया गया है।

कोड:

<script type="text/javascript">
if (top != self){
  top.location.replace(self.location.href);
  alert("for security reasons bla bla bla");
}
</script>

इसके साथ आया, और ऐसा लगता है कि कम से कम फ़ायरफ़ॉक्स और ओपेरा ब्राउज़र में काम करता है।

if(top != self) {
 top.onbeforeunload = function() {};
 top.location.replace(self.location.href);
}

ठीक है, तो हम जानते हैं कि एक फ्रेम में थे। तो हम जीईटी चर के रूप में पथ के साथ एक और विशेष पृष्ठ के लिए location.href। अब हम उपयोगकर्ता को बता रहे हैं कि क्या हो रहा है और लक्ष्य = "_ TOP" विकल्प के साथ एक लिंक प्रदान करें। यह आसान है और शायद काम करेगा (इसका परीक्षण नहीं किया गया है), लेकिन इसके लिए कुछ उपयोगकर्ता इंटरैक्शन की आवश्यकता है। हो सकता है कि आप उपयोगकर्ता को अपमानजनक साइट को इंगित कर सकें और अपनी साइट पर क्लिक जैकर्स की शर्मिंदा हॉल बना सकें .. बस एक विचार, लेकिन रात का काम ..


मैं सिर्फ फ्रेम बस्टर बस्टर जावास्क्रिप्ट को बस्ट करने का एक तरीका प्राप्त कर सकता हूं। मेरे जावास्क्रिप्ट फ़ंक्शन में getElementsByName का उपयोग करके, मैंने फ्रेम बस्टर और वास्तविक फ्रेम बस्टर बस्टर स्क्रिप्ट के बीच एक लूप सेट किया है। इस पोस्ट को देखें। http://www.phcityonweb.com/frame-buster-buster-buster-2426


बस्टर को बार-बार कॉल करने के बारे में क्या? यह दौड़ की स्थिति पैदा करेगा, लेकिन कोई उम्मीद कर सकता है कि बस्टर शीर्ष पर आता है:

(function() {
    if(top !== self) {
        top.location.href = self.location.href;
        setTimeout(arguments.callee, 0);
    }
})();

if (top != self) {
  top.location.replace(location);
  location.replace("about:blank"); // want me framed? no way!
}

हमने http://seclab.stanford.edu/websec/framebusting/framebust.pdf से हमारी वेबसाइटों में से एक में निम्नलिखित दृष्टिकोण का उपयोग किया है

<style>
 body { 
 display : none   
}
</style>
<script>
if(self == top) {
document.getElementsByTagName("body")[0].style.display = 'block';
}
else{
top.location = self.location;
}
</script>

मैं बहादुर होने जा रहा हूं और अपनी टोपी को इस पर अंगूठी में फेंक दूंगा (प्राचीन जैसा है), देखें कि मैं कितने डाउनवोट एकत्र कर सकता हूं।

यहां मेरा प्रयास है, जो हर जगह काम करता प्रतीत होता है मैंने इसका परीक्षण किया है (क्रोम 20, आईई 8 और एफएफ 14):

(function() {
    if (top == self) {
        return;
    }

    setInterval(function() {
        top.location.replace(document.location);
        setTimeout(function() {
            var xhr = new XMLHttpRequest();
            xhr.open(
                'get',
                'http://mysite.tld/page-that-takes-a-while-to-load',
                false
            );
            xhr.send(null);
        }, 0);
    }, 1);
}());

मैंने इस कोड को <head> में रखा और इसे <body> के अंत से बुलाया ताकि यह सुनिश्चित किया जा सके कि दुर्भावनापूर्ण कोड के साथ बहस शुरू होने से पहले मेरा पृष्ठ प्रस्तुत किया गया हो, यह नहीं पता कि यह सबसे अच्छा तरीका है, वाईएमएमवी।

यह कैसे काम करता है?

... मैंने सुना है कि आप पूछते हैं - अच्छी तरह से ईमानदार जवाब है, मैं वास्तव में नहीं जानता। यह हर जगह काम करने के लिए बहुत परेशान था, मैं परीक्षण कर रहा था, और यह सटीक प्रभाव है कि यह कहां चलाता है इसके आधार पर थोड़ा भिन्न होता है।

इसके पीछे सोच यहां है:

  • सबसे कम संभव अंतराल पर चलाने के लिए एक फ़ंक्शन सेट करें। मैंने देखा है कि किसी भी यथार्थवादी समाधान के पीछे मूल अवधारणा फ्रेम बस्टर-बस्टर की तुलना में शेड्यूलर को अधिक घटनाओं के साथ भरना है।
  • जब भी फ़ंक्शन आग लगती है, तो शीर्ष फ्रेम के स्थान को आजमाएं और बदलें। काफी स्पष्ट आवश्यकता है।
  • तुरंत चलाने के लिए एक फ़ंक्शन शेड्यूल करें जो पूरा करने में लंबा समय लगेगा (जिससे फ्रेम बस्टर-बस्टर को स्थान परिवर्तन के साथ हस्तक्षेप करने से अवरुद्ध कर दिया जाएगा)। मैंने एक सिंक्रोनस XMLHttpRequest चुना क्योंकि यह एकमात्र तंत्र है जिसके बारे में मैं सोच सकता हूं कि उपयोगकर्ता इंटरैक्शन की आवश्यकता नहीं है (या कम से कम पूछताछ) और उपयोगकर्ता के CPU समय को चबा नहीं देती है।

मेरे http://mysite.tld/page-that-takes-a-while-to-load (XHR का लक्ष्य) के लिए मैंने एक PHP स्क्रिप्ट का उपयोग किया जो इस तरह दिखता है:

<?php sleep(5);

क्या होता है?

  • क्रोम और फ़ायरफ़ॉक्स XHR पूर्ण होने पर 5 सेकंड प्रतीक्षा करते हैं, फिर फ़्रेम किए गए पृष्ठ के URL पर सफलतापूर्वक रीडायरेक्ट करते हैं।
  • आईई बहुत तुरंत पुनर्निर्देशित करता है

क्या आप क्रोम और फ़ायरफ़ॉक्स में प्रतीक्षा समय से बच नहीं सकते?

जाहिरा तौर पर नहीं। सबसे पहले मैंने एक्सएचआर को एक यूआरएल पर इंगित किया जो 404 लौटाएगा - यह फ़ायरफ़ॉक्स में काम नहीं करता था। तब मैंने sleep(5); की कोशिश की sleep(5); दृष्टिकोण है कि मैं अंततः इस जवाब के लिए उतरा, फिर मैंने नींद की लंबाई के साथ विभिन्न तरीकों से खेलना शुरू कर दिया। मुझे व्यवहार के लिए कोई वास्तविक पैटर्न नहीं मिला, लेकिन मुझे पता चला कि यदि यह बहुत छोटा है, तो विशेष रूप से फ़ायरफ़ॉक्स गेंद नहीं खेलेंगे (क्रोम और आईई काफी अच्छी तरह व्यवहार करते हैं)। मुझे नहीं पता कि "बहुत छोटा" की परिभाषा वास्तविक शर्तों में क्या है, लेकिन हर बार 5 सेकंड काम करता है।

यदि कोई गुजरने वाला जावास्क्रिप्ट निंजा कुछ बेहतर तरीके से समझा देना चाहता है कि क्या हो रहा है, तो यह क्यों संभव है (संभवतः) गलत, अविश्वसनीय, सबसे खराब कोड जिसे उन्होंने कभी देखा है आदि। मैं खुशी से सुनूंगा।





framebusting