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




html iframe (13)

आइए मान लें कि आप नहीं चाहते हैं कि अन्य साइटें आपकी साइट को " <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() टाइमर को साफ़ करने के किसी भी तरीके से नहीं सोच सकता

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

https://code.i-harness.com


2015 तक, आपको इसके लिए सीएसपी 2 के frame-ancestors निर्देश का उपयोग करना चाहिए। यह एक HTTP प्रतिक्रिया शीर्षलेख के माध्यम से लागू किया गया है।

जैसे

Content-Security-Policy: frame-ancestors 'none'

बेशक, कई ब्राउज़र अभी तक सीएसपी 2 का समर्थन नहीं करते हैं, इसलिए पुराना X-Frame-Options शीर्षलेख शामिल करना बुद्धिमानी है:

X-Frame-Options: DENY

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


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" देता है, और शीर्ष के बाद से। स्कार्टर इंटरवल अभी भी सुलभ है, इससे ब्लैक-टोपी हमले फ्रेम पर हार जाएंगे ऊपर वर्णित वेबसाइटें।


उच्च जैकिंग फ्रेमसेट, आईफ्रेम और छवियों जैसी किसी भी सामग्री से बचने के लिए htaccess का उपयोग करें।

RewriteEngine on
RewriteCond %{HTTP_REFERER} !^http://www\.yoursite\.com/ [NC]
RewriteCond %{HTTP_REFERER} !^$
RewriteRule ^(.*)$ /copyrights.html [L]

यह अपेक्षित के बजाय एक कॉपीराइट पेज दिखाएगा।


एफडब्ल्यूआईडब्लू, अधिकांश मौजूदा ब्राउज़र एक्स-फ्रेम-विकल्प का 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


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


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

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

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


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

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

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

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


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

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

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

window.parent.prevent_bust = 0;

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


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


मौजूदा एचटीएमएल 5 मानक को ध्यान में रखते हुए, जो आईफ्रेम के लिए सैंडबॉक्स पेश किया गया है, हमलावर सैंडबॉक्स का उपयोग करते समय इस पृष्ठ में प्रदान किए गए सभी फ्रेम बस्टिंग कोड अक्षम कर सकते हैं क्योंकि यह निम्न से iframe को प्रतिबंधित करता है:

allow-forms: Allow form submissions.
allow-popups: Allow opening popup windows.
allow-pointer-lock: Allow access to pointer movement and pointer lock.
allow-same-origin: Allow access to DOM objects when the iframe loaded form same origin
allow-scripts: Allow executing scripts inside iframe
allow-top-navigation: Allow navigation to top level window

कृपया देखें: http://www.whatwg.org/specs/web-apps/current-work/multipage/the-iframe-element.html#attr-iframe-sandbox

अब, आक्रमणकर्ता ने आईफ़्रेम में अपनी साइट होस्ट करने के लिए निम्न कोड का उपयोग किया है:

<iframe src="URI" sandbox></iframe>

फिर, सभी जावास्क्रिप्ट फ्रेम बस्टिंग कोड असफल हो जाएगा।

सभी फ्रेम बसिंग कोड की जांच करने के बाद, केवल यह रक्षा सभी मामलों में काम करती है:

<style id="antiClickjack">body{display:none !important;}</style>
<script type="text/javascript">
   if (self === top) {
       var antiClickjack = document.getElementById("antiClickjack");
       antiClickjack.parentNode.removeChild(antiClickjack);
   } else {
       top.location = self.location;
   }
</script>

मूल रूप से http://seclab.stanford.edu/websec/framebusting/framebust.pdf द्वारा प्रस्तावित http://seclab.stanford.edu/websec/framebusting/framebust.pdf


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

कोड:

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

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

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

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

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

कोड यहाँ है। आपको मानक 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>

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






framebusting