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


422

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

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

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

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

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

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

<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घटना हैंडलर के
  • एक टाइमर सेट करता है जो हर मिलीसेकंड के माध्यम से आग लगाता है setInterval() , और अगर वह काउंटर को देखता है, तो वर्तमान स्थान को हमलावर के नियंत्रण के सर्वर में बदल देता है
  • वह सर्वर HTTP स्थिति कोड 204 के साथ एक पृष्ठ पर कार्य करता है , जिससे ब्राउज़र कहीं भी नेविगेट करने का कारण नहीं बनता है

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

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

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

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


6
मुझे यकीन नहीं है कि फ्रेम-बस्टर-बस्टर वास्तव में काम करता है ... जब मैं इसका परीक्षण करने की कोशिश करता हूं (एक हैंडलर को पुनर्निर्देशित करता हूं जिसे मैंने 204 में वापस करने के लिए स्थापित किया है), यह मुझे पृष्ठ के बाहर कहीं भी नेविगेट करने से रोकता है - जिसमें टाइपिंग सामान शामिल है एड्रेस बार में! मुझे कहीं भी जाने के लिए ब्राउज़र टैब को बंद करना होगा और एक नया खोलना होगा। इसलिए दूसरे शब्दों में, मुझे यकीन नहीं है कि इसे एक समाधान की आवश्यकता है, क्योंकि फ्रेम-बस्टर-बस्टर का पर्दाफाश करना चाहते हैं ... के साथ शुरू करने का भंडाफोड़ किया है। :) (या तो मैंने या मेरे टेस्ट को खराब कर दिया, जो कभी नहीं हो सकता ...);)
मैट विनकलर

16
मैट, ऊपर फ्रेम-बस्टर-बस्टर कोड निश्चित रूप से काम करता है। ए .. उह .. दोस्त .. मेरा .. मुझे इसके बारे में बताया। या कुछ और। :)
जेफ एटवुड

10
जेफ, क्या आप एक ही डोमेन पर दोनों खिड़कियों के साथ परीक्षण कर रहे हैं? ऐसा लगता है जैसे आप हैं क्योंकि अगर आप नहीं थे तो सुरक्षा प्रतिबंध आपको 'ऑनबियरऑनलोड' को संशोधित करने से रोकेंगे
जेम्स

29
साइड नोट पर: उदाहरण पोस्ट करते समय, कृपया example.orgRFC 2606 ietf.org/rfc/rfc2606.txt
Christoph

3
काउंटर-काउंटर-काउंटरमेशर्स के सामान्य विषय के बारे में: galactanet.com/comic/view.php?strip=209
Joey

जवाबों:


149

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

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

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

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


2
मैंने यह कोशिश की है और यह काम करता है। एक अन्य टुकड़ा जो मुझे इस समाधान के बारे में पसंद है वह यह है कि यह उपयोगकर्ता को प्रकाश में लाता है कि वह आपकी सामग्री पर जाने से पहले किस तरह की साइट पर था। नमूना कोड: अगर (parent.frames.length> 0) {top.location.replace (document.location); setTimeout (फ़ंक्शन () {if (parent.frames.length> 0) {document.location = " google.com ";}}, 10); }
पोप

न केवल यह दुरुपयोग से बचने का एक अच्छा तरीका है, यह उन साइटों के लिए बहुत अनुकूल है, जो आपकी साइट को सिर्फ इससे झांकना चाहते हैं, हालांकि इसका उपयोग करने की अनुमति नहीं है। आदर्श रूप से, मुझे लगता है कि साइट के मुखपृष्ठ का एक स्क्रीनशॉट इस्तेमाल किया जाना चाहिए, कुछ स्पष्टीकरण के साथ कि इसका उपयोग शीर्ष पर iframe में क्यों नहीं किया जा सकता है।
१०:१० पर

33
ऐसा फेसबुक करता है।
शामतोमर

2
लेकिन शायद इसका फायदा उठाया जा सकता है अगर बदले में बस्टिंग साइट एक गलत विरोधी विरोधी बना देगी ... (डननो हम अब तक कितने विरोधी हैं) खुद के लिए lighbox div एक फिशिंग लिंक या जो कुछ भी प्रस्तुत कर रहा है ... tbc
yunn

7
एक अन्य विचार सिर्फ पृष्ठ को पूरी तरह से मिटा देना होगा जैसे document.write("");(आपके द्वारा स्थापित किए जाने के बाद कि इसे फंसाया जा रहा है
gabeio

211

Fwiw, सबसे मौजूदा ब्राउज़र का समर्थन X- फ़्रेम-विकल्प: से इनकार निर्देश है, जो भी काम करता है जब स्क्रिप्ट निष्क्रिय है।

IE8:
http://blogs.msdn.com/ie/archive/2009/01/27/ie8-security-part-vi-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

Chrome / Webkit
http://blog.chromium.org/2010/01/security-in-depth-new-security-features.html
http://trac.webkit.org/changeset/42333


6
उत्कृष्ट, ब्राउज़र में यह समर्थन। exe एक शक के बिना जाने का तरीका है। जब आप "अधिकांश ब्राउज़र" कहते हैं, तो कौन सा विशेष रूप से? मुझे IE8 के लिए कुछ भी अच्छा स्रोत नहीं मिल रहा है।
जेफ एटवुड

2
यहाँ एक परीक्षण पृष्ठ है: Enhanie.com/test/clickjack । क्रोम 4.1.249.1042 सपोर्ट करता है। ओपेरा 10.50 सपोर्ट करता है। फ़ायरफ़ॉक्स 3.6.2 अभी तक समर्थन नहीं करता है। सफारी 4.0.3 सपोर्ट करती है।
एरिकलाव

1
फ़ायरफ़ॉक्स 3.6.9 इसे मूल रूप से समर्थन करेगा ( hackademix.net/2010/08/31/… ) और NoScript के साथ स्थापित किसी भी फ़ायरफ़ॉक्स को 2009 की शुरुआत के बाद से ( hackademix.net/2009/01/29/x-frame- विकल्प-इन-फ़ायरफ़ॉक्स )
ssokolow

4
इसे जावास्क्रिप्ट फ्रेमबस्टर के साथ जोड़ना सबसे अच्छा है।
जेसी वीगर्ट

1
या इस पृष्ठ पर दिसंबर '12 उत्तर के साथ इसे
मिलाएं

34

हमने अपनी वेबसाइट में 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>

3
बिंगो! यकीन नहीं है कि यह अधिक उत्तोलन नहीं है क्योंकि यह सबसे अच्छा उत्तर है (एक्स-फ्रेम-ऑप्शंस के उत्तर के बगल में, लेकिन यह दोनों को संयोजित करना सबसे अच्छा है)
जेसी वीगर्ट

1
यह उत्तर या मेरा चयन किया जाना चाहिए :)

मुझे यह और एक्स-फ्रेम-विकल्प दोनों का उपयोग करने का आपका विचार पसंद है: इनकार जवाब।
मैक्स वेस्ट

इसके लिए JS की आवश्यकता है, जो एक बहुत बड़ा बोझ IMHO है।
नवीन

1
+1 - यह सबसे अच्छा उत्तर है जब X-FRAME-OPTIONS का उपयोग नहीं किया जा सकता है। (उदाहरण के लिए, जब आपको संदर्भकर्ता के आधार पर सशर्त अनुमति देने या इनकार करने की आवश्यकता होती है।)
जय सुलिवन

29

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

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

2
जानी और जेफ के समाधान (एक बार संपादित) दोनों सही हैं और समान रूप से काम करते हैं; जानी को स्वीकार करना क्योंकि उनके समाधान ने बिना किसी संपादन के सही काम किया
जेफ एटवुड ने

29
यह तभी काम करेगा जब दो विंडो एक ही डोमेन की हों; एक दुर्लभ घटना जब आप एक फ्रेम से बचना चाहते हैं।
जेम्स

अगर वहाँ नेस्टेड फ़्रेम शामिल हैं, तो आपको फ़्रेम श्रृंखला को चलना होगा और सभी onbeforeunloadहैंडलर को निकालना होगा , न कि केवल शीर्ष पर!
क्रिस्टोफ

12
महत्वपूर्ण स्पष्टीकरण: यह मेरे लिए काम करता है क्योंकि iframe src = गतिशील रूप से सेट किया जा रहा था, और इस प्रकार क्रॉस-डोमेन नीति प्रभावी नहीं थी। JP बिल्कुल सही है, एक स्थिर src में = यह काम नहीं करेगा।
जेफ एटवुड

5
ठीक है अब कोई एक फ्रेम बस्टर बस्टर बस्टर बस्टर के साथ आ सकता है?
एपागा

23

वर्तमान HTML5 मानक को ध्यान में रखते हुए, जिसने iframe के लिए सैंडबॉक्स पेश किया था, इस पृष्ठ में दिए गए सभी फ़्रेम बस्टिंग कोड को अक्षम किया जा सकता है जब हमलावर सैंडबॉक्स का उपयोग करता है क्योंकि यह निम्नलिखित से 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 में आपकी साइट को होस्ट करने के लिए निम्नलिखित कोड का उपयोग किया है:

<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>

मूल रूप से गुस्ताव रिडस्टेड, एली बर्स्ज़ेटिन, डैन बोन और कोलिन जैक्सन (2010) द्वारा प्रस्तावित


19

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

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

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


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

6

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

यहाँ मेरा प्रयास है, जो हर जगह काम करता है, मैंने इसे (Chrome20, IE8 और FF14) का परीक्षण किया है।

(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>सुनिश्चित करने के लिए कि यह दुर्भावनापूर्ण कोड के साथ बहस शुरू करने से पहले मेरे पेज को रेंडर किया गया है, यह सुनिश्चित करने के लिए कि यह सबसे अच्छा तरीका है, YMMV।

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

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

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

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

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

<?php sleep(5);

क्या होता है?

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

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

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


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


लगता है आप अपने सभी चिंताजनक वाक्य हटा सकते हैं
mplungjan

6

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

जैसे

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

बेशक, कई ब्राउज़र CSP2 का समर्थन नहीं करते हैं फिर भी पुराने X-Frame-Optionsहेडर को शामिल करना बुद्धिमानी है :

X-Frame-Options: DENY

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


1
सभी प्रमुख ब्राउज़र अब CSP का समर्थन करते हैं। यह 2019 में सही उत्तर है और भविष्य का भविष्य है।
स्टीफन आर

5

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


5

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

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

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

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

यहाँ कोड है। आपको सुरक्षित मानों के लिए मानक 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>

इसके साथ समस्या यह है कि फ्रेम-मेकर स्थिति का उपयोग कर सकता है: अपने निष्क्रिय बटन के शीर्ष पर सक्रिय बटन लगाने के लिए निरपेक्ष और उपयोगकर्ता बस आपके वेबपेज को देखेगा और यह सोचेगा कि वे आपके बटन क्लिक कर रहे हैं।
jmucchiello

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

यदि इसे IE8 प्रतिबंधित ज़ोन फ्रेम या क्रोम सैंडबॉक्स फ़्रेम में रखा गया है तो जावास्क्रिप्ट कभी नहीं चलेगा। मुझे आश्चर्य है कि उन मामलों में क्या संशोधनों की आवश्यकता है
goodguys_activate

4

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

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

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

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


आउटलुक (पूर्व में हॉटमेल) 'परमाणु हो जाता है' अगर यह एक फ्रेम से बाहर नहीं निकल सकता है - यह <body>एक <plaintext>टैग सेट के अंदर की पूरी सामग्री डालता है display: none। यह काफी प्रभावी है।
२०

4

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

कोड:

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

3

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

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

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

window.parent.prevent_bust = 0;

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


1
मैंने आपका कोड नमूना (माता-पिता के लिए परीक्षण विफल होता है) संपादित किया, लेकिन संपादित संस्करण काम नहीं करता है!
जेफ एटवुड

1
ठंडा। यह हमेशा बेकार कोड के साथ जवाब देने के लिए मुश्किल है - मैं इसे कम से कम विचार प्राप्त करने के लिए करता हूं - और गरीब पूछने वाले को डिबग करने देता हूं। :)
जेफ मीटबॉल यांग

12
यदि माता-पिता अलग डोमेन पर काम नहीं करेंगे, तो ऐसा होने की संभावना है!
जोश स्टोडोला

2

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

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

2

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

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

2

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


0

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

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


0

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

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

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


यह उस रेफ़र पर निर्भर करता है जो a) हमेशा सेट नहीं होता है (ब्राउज़र सेटिंग्स या एक्सटेंशन के कारण या केवल इसलिए कि रेफ़रिंग पेज HTTPS का उपयोग किए बिना उपयोग कर रहा है <meta name="referrer" …/>और b) लिंक पर क्लिक करते समय भी सेट होता है, इसलिए आप अपने पेज के लिंक को भी तोड़ देते हैं और तोड़ देते हैं मकड़जाल।
मार्टिन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.