在页面加载期间,我如何确定我的页面被嵌入到其他网站的框架中? 我猜referrer请求标头不能帮助我这里?谢谢。
在页面加载期间,我如何确定我的页面被嵌入到其他网站的框架中? 我猜referrer请求标头不能帮助我这里?谢谢。
在服务器端无法检测它,但你可以在页面加载后使用JavaScript来检测它。比较top
和self
,如果它们不相同,则表示当前页面被嵌套在了一个框架中。
此外,一些现代浏览器支持 X-FRAME-OPTIONS
头信息,该头信息有两个值:
Google的Picasa等用户不能被嵌入到框架中。
支持该头信息的浏览器及其最低版本:
Stackoverflow 包含一些 JS 代码用于测试(master.js
)。这是相关部分:
if(top!=self){
top.location.replace(document.location);
alert("For security reasons, framing is not allowed; click OK to remove the frames.")
}
但要记住JS可能会被禁用。
对于现代浏览器,您可以使用CSP(内容安全策略),这是一种标准。以下标头将防止文档在任何框架中加载:
Content-Security-Policy: frame-ancestors 'none'
(不过,IE 11需要使用X-
前缀)。您还可以将'none'
更改为允许框架的来源,例如您自己的网站。
为了覆盖旧版浏览器,最好与@Maerlyn的答案一起使用。
您可以使用JavaScript防止页面加载到iframe中
<script type="text/javascript">
if ( window.self !== window.top ) {
window.top.location.href=window.location.href;
}
</script>
这段代码会将您页面中的iframe所在容器的地址更改为您页面的地址,并强制容器显示您的页面。
sandbox
属性允许禁止这种框架逃避黑客攻击。因此,如果您关心安全问题,则这种方法不是一种安全的防止框架的方式。 - Frédéric如果您不介意某些地方有您的内容,但不希望它出现在特定网站上,您可以阻止特定域名。例如,如果 offendingdomain.com
嵌入了您的内容,则可以执行以下操作:
<script type="text/javascript">
if(document.referrer.indexOf("offendingdomain.com") != -1) {
window.location = "http://www.youtube.com/watch_popup?v=oHg5SJYRHA0";
}
</script>
这段代码会检查父文档的位置,并查看是否是嵌入您的内容的offendingdomain.com
。这个脚本会将该iframe发送到一个著名的Youtube视频作为惩罚。实际上,他们只是自己被Rick-Rolled了。
<script type="text/javascript">
if(top.location != window.location) {
window.location = '/error_iframe.php';
}
</script>
<?php
header("Content-Security-Policy: frame-ancestors 'none'");
?>
我在头部使用这段PHP代码
if($_SERVER['SERVER_NAME'] != 'yourwebsite.com'){
header('location: yourwebsite.com');
}
如果有人嵌入了你的网站,它会重定向到你的网站。
将 hosname 替换为域名
if (window.top.location.host != "hostname") {
document.body.innerHTML = "Access Denied";
}