一些网站具有“突破”IFRAME
封装的代码,这意味着如果页面A
作为父页面P
内的IFRAME
加载,A
中的一些Javascript会将外部窗口重定向到A
。
通常,此Javascript如下所示:
<script type="text/javascript">
if (top.location.href != self.location.href)
top.location.href = self.location.href;
</script>
我的问题是:作为父页面P
的作者,而不是内部页面A
的作者,我如何防止A
进行这种突破?
附注:在我看来,这应该是一个跨站点的安全违规行为,但事实并非如此。
发布于 2008-12-15 20:21:36
尝试使用onbeforeunload属性,该属性将让用户选择是否要离开页面。
示例:https://developer.mozilla.org/en-US/docs/Web/API/Window.onbeforeunload
在HTML5中,您可以使用沙箱属性。请看下面Pankrat的答案。http://www.html5rocks.com/en/tutorials/security/sandboxed-iframes/
发布于 2013-08-06 14:36:09
在阅读了w3.org spec之后。我找到了沙盒的属性。
您可以设置sandbox=""
,这会阻止iframe重定向。也就是说,它也不会重定向iframe。你将会从根本上失去点击。
示例如下:http://jsfiddle.net/ppkzS/1/
没有沙箱的示例:http://jsfiddle.net/ppkzS/
发布于 2012-08-04 00:03:59
我知道问题已经有很长一段时间了,但这是我的改进版本,只有在加载iframe时,它才会等待500ms等待任何后续调用。
<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中。
https://stackoverflow.com/questions/369498
复制相似问题