某些网站具有“突破”
IFRAME
外壳的代码,这意味着如果页面A
作为父页面中的IFRAME
加载,P
中的某些Javascript会将外部窗口重定向到 A
。通常这个 Javascript 看起来像这样:
A
我的问题是:作为父页面
<script type="text/javascript">
if (top.location.href != self.location.href)
top.location.href = self.location.href;
</script>
的作者而不是内页
P
的作者,我怎样才能阻止A
进行这种突破?附注在我看来,这应该是跨站点安全违规,但事实并非如此。
属性。在撰写本文时,适用于 Chrome、Safari、Firefox 以及最新版本的 IE 和 Opera,但几乎可以满足您的需求:
A
如果您想允许
顶级重定向,请指定<iframe src="url" sandbox="allow-forms allow-scripts"></iframe>
。
<iframe sandbox="allow-same-origin allow-scripts allow-popups allow-forms" src="http://www.example.com"</iframe>
,这可以防止 iframe 重定向。话虽这么说,它也不会重定向 iframe。您基本上会失去点击次数。
示例如下:http://jsfiddle.net/ppkzS/1/
没有沙箱的示例:http://jsfiddle.net/ppkzS/
sandbox=""
和
<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()"
必须添加到框架或 iframe 中。还有 iframe 安全属性,仅适用于 IE 和 Opera
:(
onreadystatechange="frameLoad();"
这在 Firefox 和 ie 中都有效,这就是我测试的结果。 你会发现使用诸如 evt.return(whatever) 之类的东西的版本...在 firefox 中不起作用。
<script type="text/javascript">
window.onbeforeunload = function () {
return "This will end your session";
}
</script>
<iframe sandbox=" "></iframe>
事件,并在发生更改时更正它的
onload
。 iframe 闪烁,但这对我来说没问题。src