这个问题以前被问过并正确回答,但似乎没有发布解决方案。
如果一个站点有 iframe,并且想要防止这些 iframe 被包含在来自不同域的框架中,那么简单的 frame-busting 将没有用:
<script>if (top != self) top.location = location</script>
但是,由于对其他域的跨框架脚本应该会产生异常,因此在 iframe 中似乎可以很好地工作:
<script>
try {
if (window.document.domain != top.document.domain) { // throws exception
throw "You naughty puppy!"; // Should not ever get here, right?
}
}
catch () {
top.location = "/error/naughtypuppy";
}
</script>
以上if
内容本身就足以防止 iframe 的跨域框架。它应该只返回false
或抛出异常,那么脚本是否可以throw
在浏览器中访问语句?
这是否足以防止仅来自其他域的框架?
<script>
try {
var bogus = top.document.domain;
}
catch () {
top.location = "/error/naughtypuppy";
}
</script>
编辑:这里暗示了一个类似的解决方案,但不会依赖父框架来包含破坏框架的代码。检测 iframe 何时是跨域的,然后退出它。本质上与“尝试访问其他框架并在发生异常时破坏”相同的解决方案。