Einige Websites haben Code zum "Ausbrechen" von IFRAME
- Anlagen, dh wenn eine Seite A
als IFRAME
innerhalb einer übergeordneten Seite P
geladen wird Javascript in A
leitet das äußere Fenster zu A
um.
In der Regel sieht Javascript so aus:
<script type="text/javascript">
if (top.location.href != self.location.href)
top.location.href = self.location.href;
</script>
Meine Frage lautet: Wie kann ich verhindern, dass P
als Autor der übergeordneten Seite A
und nicht als Autor der inneren Seite A
diesen Ausbruch vornimmt?
P.S. Mir scheint, es sollte eine standortübergreifende Sicherheitsverletzung sein, aber das ist es nicht.
Versuchen Sie es mit der Eigenschaft onbeforeunload, mit der der Benutzer auswählen kann, ob er von der Seite weg navigieren möchte.
Beispiel: https://developer.mozilla.org/en-US/docs/Web/API/Window.onbeforeunload
In HTML5 können Sie die Sandbox-Eigenschaft verwenden. Bitte lesen Sie die Antwort von Pankrat weiter unten. http://www.html5rocks.com/de/tutorials/security/sandboxed-iframes/
Mit HTML5 wurde das Attribut iframe sandbox hinzugefügt. Zum Zeitpunkt des Schreibens dieses funktioniert auf Chrome, Safari, Firefox und den neuesten Versionen von IE und Opera aber macht so ziemlich das, was Sie wollen:
<iframe src="url" sandbox="allow-forms allow-scripts"></iframe>
Wenn Sie Weiterleitungen auf oberster Ebene zulassen möchten, geben Sie sandbox="allow-top-navigation"
.
Ich benutze sandbox = "..."
Top-Navigation ist das, was Sie verhindern möchten, also lassen Sie das weg und es wird nicht erlaubt. Alles, was weggelassen wird, wird blockiert.
ex.
<iframe sandbox="allow-same-Origin allow-scripts allow-popups allow-forms" src="http://www.example.com"</iframe>
Nach dem Lesen der w3.org spec . Ich habe die Sandkasteneigenschaft gefunden.
Sie können sandbox=""
, wodurch verhindert wird, dass der Iframe umgeleitet wird. Davon abgesehen leitet es den Iframe auch nicht weiter. Sie werden den Klick im Wesentlichen verlieren.
Beispiel hier: http://jsfiddle.net/ppkzS/1/
Beispiel ohne Sandbox: http://jsfiddle.net/ppkzS/
Ich weiß, dass es lange her ist, dass die Frage gestellt wurde, aber hier ist meine verbesserte Version, die 500 ms auf jeden nachfolgenden Aufruf wartet, nur wenn der Iframe geladen ist.
<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>
und onload="frameLoad()"
und onreadystatechange="frameLoad();"
müssen zum Frame oder iFrame hinzugefügt werden.
Ich habe einige nützliche Hacks dazu gefunden:
http://www.codinghorror.com/blog/2009/06/we-done-been-framed.html
http://coderrr.wordpress.com/2009/02/13/preventing-frame-busting-and-click-jacking-ui-redressing/
In meinem Fall möchte ich, dass der Benutzer die innere Seite besucht, damit der Server seine IP als Besucher sieht. Wenn ich die PHP-Proxy-Technik verwende, denke ich, dass die innere Seite meine Server-IP als Besucher sieht, also ist es nicht gut. Die einzige Lösung, die ich bisher gefunden habe, ist die vor dem Laden. Tragen Sie dies auf Ihre Seite ein:
<script type="text/javascript">
window.onbeforeunload = function () {
return "This will end your session";
}
</script>
Dies funktioniert sowohl in Firefox als auch in dem, was ich getestet habe. Sie finden Versionen mit so etwas wie evt.return (was auch immer) Mist ..., der in Firefox nicht funktioniert.
Da die Seite, die Sie im iframe laden, den Code "break out" mit einem setInterval ausführen kann, ist onbeforeunload möglicherweise nicht so praktisch, da der Benutzer mit "Sind Sie sicher, dass Sie das Programm verlassen möchten?" Dialoge.
Es gibt auch das iframe-Sicherheitsattribut, das nur für IE & Opera funktioniert
:(
Auf diese Weise können Sie alle Aktionen der gerahmten Seite steuern, die Sie nicht ausführen können. Same-Domain Origin-Richtlinie gilt.