IFRAME को शीर्ष-स्तरीय विंडो को पुनर्निर्देशित करने से कैसे रोका जाए


133

कुछ वेबसाइटों के पास IFRAMEबाड़ों के "ब्रेक आउट" का कोड होता है , जिसका अर्थ है कि यदि कोई पृष्ठ एक मूल पृष्ठ के अंदर Aलोड किया जाता IFRAMEहै तो Pकुछ जावास्क्रिप्ट Aबाहरी विंडो को पुनर्निर्देशित करता है A

आमतौर पर यह जावास्क्रिप्ट कुछ इस तरह दिखता है:

<script type="text/javascript">
  if (top.location.href != self.location.href)
     top.location.href = self.location.href;
</script>

मेरा प्रश्न यह है: मूल पृष्ठ Pके लेखक के रूप में और आंतरिक पृष्ठ के लेखक के रूप में नहीं A, मैं Aइस विराम को करने से कैसे रोक सकता हूं ?

PS यह मुझे ऐसा लगता है जैसे यह एक क्रॉस-साइट सुरक्षा उल्लंघन होना चाहिए, लेकिन ऐसा नहीं है।


मुझे नहीं लगता कि आप बहुत कुछ कर सकते हैं ... यदि आप फ्रेम सामग्री के लेखक नहीं हैं।
स्क्यूलिफ

जवाबों:


43

Onbeforeunload संपत्ति का उपयोग करने का प्रयास करें, जो उपयोगकर्ता को यह चुनने देगा कि वह पृष्ठ से दूर नेविगेट करना चाहता है या नहीं।

उदाहरण: https://developer.mozilla.org/en-US/docs/Web/API/Window.onlforeforeload

HTML5 में आप सैंडबॉक्स प्रॉपर्टी का उपयोग कर सकते हैं। पंकरत का जवाब नीचे देखें। http://www.html5rocks.com/en/tutorials/security/sandboxed-iframes/


1
iFrames कर का उपयोग कर, क्रॉस-डोमेन संचार की अनुमति हालांकि, postMessage। यह सुरक्षा जोखिम नहीं है, लेकिन किसी को यह जानने की परवाह हो सकती है कि यह क्षमता मौजूद है जब वे आपकी टिप्पणी देखते हैं। :)
कोरीवर्ड

यह उत्तर लिखना संभव नहीं था। यह इंगित करने के लिए धन्यवाद।
fasih.rana

@SirDarius आप एक उदाहरण दिखा सकते हैं, बहुत सराहना की।
user198989

उपयोगकर्ता को यह पता नहीं होगा कि यह पुष्टि क्यों दिखाई देती है, और संभवतः यादृच्छिक प्रतिक्रिया का चयन करेगा। मैं इसका उपयोग करने की सलाह नहीं देता। अन्य solutions- रहे हैं sandbox
ओरिदम

1
@ fasih.rana दूसरे लेख ने मुझे बहुत मदद की। धन्यवाद;)
MrD

127

HTML5 के साथ iframe सैंडबॉक्स विशेषता जोड़ा गया था। लिखने के समय यह क्रोम, सफारी, फ़ायरफ़ॉक्स और आईई और ओपेरा के हाल के संस्करणों पर काम करता है लेकिन आप जो चाहते हैं वह बहुत अधिक करता है:

<iframe src="url" sandbox="allow-forms allow-scripts"></iframe>

यदि आप शीर्ष स्तर के पुनर्निर्देश को निर्दिष्ट करने की अनुमति देना चाहते हैं sandbox="allow-top-navigation"


रुको क्या? उन्होंने आपको ऐसा करने दिया? मैंने सोचा कि अगर कोई वेबसाइट तोड़ना चाहता है, तो सभी ब्राउज़र इसे छोड़ देंगे। लोगों को अपनी वेबसाइट को iframes के बाहर कैसे रखना चाहिए? मैं हालांकि, भयानक शिकायत नहीं कर रहा हूँ।
Farzher


1
@StephenSarcsamKamenar यदि आप अपनी साइट को iframe में प्रदर्शित होने से बचाना चाहते हैं तो SAMEORIGIN मान के साथ X- फ्रेम-ऑप्शन हैडर उपलब्ध है । अधिकांश आधुनिक ब्राउज़र इस हेडर के साथ iframe में साइट प्रदर्शित नहीं करेंगे।
ग्रेज़गोरज़

4
दुर्भाग्य से sandboxसैंडबॉक्स फ्रेम में फ्लैश या किसी अन्य प्रकार की वस्तु की अनुमति नहीं देता है, जिससे sandboxकई मामलों में सुविधा बेकार हो जाती है।
ओरीदम

1
आइफ्रेम में शामिल किए जाने के विरोध में वेबसाइटों को "ब्रेक आउट" नहीं करना चाहिए। वे बस एक संदेश दिखा सकते हैं या खाली जा सकते हैं। दुर्भाग्य से, स्क्रिप्ट को iframe में चलने की अनुमति देता है, फिर भी आपको एक दुष्ट iframe करते समय खोलता है (1) {} और अन्य अनंत लूप। मैं चाहता हूं कि प्रत्येक iframe को अपना धागा मिल सके।
ग्रेगरी मैगर्सक

51

मैं सैंडबॉक्स = "..." का उपयोग करता हूं

  • अनुमति-प्रपत्र फ़ॉर्म जमा करने की अनुमति देता है
  • अनुमति-पॉपअप पॉपअप की अनुमति देता है
  • allow-pointer-lock पॉइंटर लॉक की अनुमति देता है
  • अनुमति-समान-मूल दस्तावेज़ को अपनी उत्पत्ति बनाए रखने की अनुमति देता है
  • अनुमति-स्क्रिप्ट जावास्क्रिप्ट निष्पादन की अनुमति देता है, और सुविधाओं को स्वचालित रूप से ट्रिगर करने की अनुमति देता है
  • अनुमति-टॉप-नेविगेशन दस्तावेज़ को शीर्ष-स्तरीय विंडो को नेविगेट करके फ्रेम से बाहर तोड़ने की अनुमति देता है

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

पूर्व।

        <iframe sandbox="allow-same-origin allow-scripts allow-popups allow-forms" src="http://www.example.com"</iframe>

3
ध्यान दें कि फ्लैश (और किसी भी अन्य ऑब्जेक्ट) को भी अवरुद्ध किया जाएगा, जिसमें कोई भी अनुमति नहीं है। यह "सुरक्षा सुविधा" मुझे एक साथ सैंडबॉक्स का उपयोग करने से रोक रही है
oriadam

8

W3.org युक्ति पढ़ने के बाद । मुझे सैंडबॉक्स प्रॉपर्टी मिली।

आप सेट कर सकते हैं sandbox="" , जो iframe को पुनर्निर्देशन से रोकता है। कहा जा रहा है कि यह iframe को पुनर्निर्देशित नहीं करेगा। आप अनिवार्य रूप से क्लिक खो देंगे।

यहाँ उदाहरण: http://jsfiddle.net/ppkzS/1/
सैंडबॉक्स के बिना उदाहरण: http://jsfiddle.net/ppkzS/


4

मुझे पता है कि यह एक लंबा समय हो गया है क्योंकि सवाल किया गया था, लेकिन यहां मेरा बेहतर संस्करण है, यह किसी भी बाद के कॉल के लिए 500ms प्रतीक्षा करेगा जब केवल iframe लोड किया जाता है।

<script type="text/javasript">
var prevent_bust = false ;
    var from_loading_204 = false;
    var frame_loading = false;
    var prevent_bust_timer = 0;
    var  primer = true;
    window.onbeforeunload = function(event) {
        prevent_bust = !from_loading_204 && frame_loading;
        if(from_loading_204)from_loading_204 = false;
        if(prevent_bust){
            prevent_bust_timer=500;
        }
    }
    function frameLoad(){
        if(!primer){
            from_loading_204 = true;
            window.top.location = '/?204';
            prevent_bust = false;
            frame_loading = true;
            prevent_bust_timer=1000;
        }else{
            primer = false;
        }
    }
    setInterval(function() {  
        if (prevent_bust_timer>0) {  
            if(prevent_bust){
                from_loading_204 = true;
                window.top.location = '/?204';
                prevent_bust = false;
            }else if(prevent_bust_timer == 1){
                frame_loading = false;
                prevent_bust = false;
                from_loading_204 = false;
                prevent_bust_timer == 0;
            }



        }
        prevent_bust_timer--;
        if(prevent_bust_timer==-100) {
            prevent_bust_timer = 0;
        }
    }, 1);
</script>

और onload="frameLoad()"और onreadystatechange="frameLoad();"फ्रेम या iframe में जोड़ा जाना चाहिए।


3

2

जब से आप iframe के अंदर लोड किए गए पृष्ठ को एक setInterval के साथ "ब्रेक आउट" कोड निष्पादित कर सकते हैं, onbeforeunload वह व्यावहारिक नहीं हो सकता है, क्योंकि यह उपयोगकर्ता को 'क्या आप छोड़ना चाहते हैं?' संवाद।

आईफ्रेम सुरक्षा विशेषता भी है जो केवल IE और ओपेरा पर काम करती है

:(


2

मेरे मामले में मैं चाहता हूं कि उपयोगकर्ता आंतरिक पृष्ठ पर जाएं ताकि सर्वर एक आगंतुक के रूप में उनके आईपी को देख सके। अगर मैं php प्रॉक्सी तकनीक का उपयोग करता हूं तो मुझे लगता है कि आंतरिक पृष्ठ एक आगंतुक के रूप में मेरे सर्वर आईपी को देखेगा, इसलिए यह अच्छा नहीं है। एकमात्र समाधान जो मुझे अब तक मिला है, वह है ऑनबॉर्फ़नलोड। इसे अपने पेज पर डालें:

<script type="text/javascript">
    window.onbeforeunload = function () {                       
         return "This will end your session";
    }
</script>

यह फ़ायरफ़ॉक्स और यानी दोनों में काम करता है, जो मैंने परीक्षण किया था। आप evt.return (जो भी) बकवास ... जैसे कुछ का उपयोग करके संस्करण पाएंगे, जो फ़ायरफ़ॉक्स में काम नहीं करता है।


0

ऐसा करने से आप फ़्रेम किए गए पृष्ठ की किसी भी कार्रवाई को नियंत्रित करने में सक्षम होंगे, जिसे आप नहीं कर सकते। समान-डोमेन मूल नीति लागू होती है।


20
मैं IFRAME के ​​अंदर क्या है, इसे नियंत्रित करने के लिए नहीं कह रहा हूं। मैं IFRAME के ​​अंदर मुझे नियंत्रित करने से रोकने के लिए कह रहा हूं ।
जेसन कोहेन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.