Jas*_*hen 123 html javascript iframe
有些网站的代码是"打破" IFRAME
外壳,这意味着如果页面A
作为IFRAME
父页面内部加载,P
一些Javascript A
会将外部窗口重定向到A
.
通常这个Javascript看起来像这样:
<script type="text/javascript">
if (top.location.href != self.location.href)
top.location.href = self.location.href;
</script>
Run Code Online (Sandbox Code Playgroud)
我的问题是:作为父页面P
的作者而不是内页的作者,A
我A
该如何防止这种突破呢?
PS在我看来,它应该是一个跨站点安全违规,但事实并非如此.
Pan*_*rat 120
使用HTML5,添加了iframe沙箱属性.在撰写本文时,这适用于Chrome,Safari,Firefox以及IE和Opera的最新版本,但可以满足您的需求:
<iframe src="url" sandbox="allow-forms allow-scripts"></iframe>
Run Code Online (Sandbox Code Playgroud)
如果要允许顶级重定向指定sandbox="allow-top-navigation"
.
小智 44
我用sandbox ="......"
顶部导航是您想要阻止的,因此请将其保留,并且不允许这样做.遗漏的任何东西都会被封锁
恩.
<iframe sandbox="allow-same-origin allow-scripts allow-popups allow-forms" src="http://www.example.com"</iframe>
Run Code Online (Sandbox Code Playgroud)
fas*_*ana 41
尝试使用onbeforeunload属性,该属性将允许用户选择是否要离开页面.
示例:https://developer.mozilla.org/en-US/docs/Web/API/Window.onbeforeunload
在HTML5中,您可以使用沙箱属性.请参阅下面的Pankrat的回答. http://www.html5rocks.com/en/tutorials/security/sandboxed-iframes/
阅读完w3.org规范后.我找到了沙盒属性.
您可以设置sandbox=""
,以防止iframe重定向.据说它也不会重定向iframe.你基本上会失去点击.
示例:http://jsfiddle.net/ppkzS/1/
没有沙箱的示例:http://jsfiddle.net/ppkzS/
小智 5
我知道自从问题解决以来已经很长时间了,但这是我的改进版本,只有在加载 iframe 时,它才会等待 500 毫秒以进行任何后续调用。
<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>
Run Code Online (Sandbox Code Playgroud)
和onload="frameLoad()"
和 onreadystatechange="frameLoad();"
必须被添加到该帧或iframe。