如何防止我的网站页面通过iFrame的第三方网站框架加载
如何在页面加载过程中发现我的页面是作为框架embedded到其他网站的? 我猜引用者请求标题不能帮助我在这里? 谢谢。
你不能从服务器端检查,但你可以使用JavaScript来检测页面加载后。 比较top
和self
,如果他们不相同,你在一个框架。
另外,一些现代的浏览器会尊重X-FRAME-OPTIONS
标题,它可以有两个值:
- DENY – 如果页面包含在框架中,则防止页面呈现
- SAMEORIGIN – 与上面相同,除非页面与顶级框架集持有者属于同一个域。
用户包括Google的Picasa,无法embedded到框架中。
支持标题的浏览器,最低版本:
- IE8和IE9
- 歌剧10.50
- Safari 4
- Chrome 4.1.249.1042
- Firefox 3.6.9( NoScript的旧版本)
Stackoverflow包含一些JS来testing它( 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'
更改为允许框架的来源,例如您自己的网站。
为了覆盖较老的浏览器,最好和@Merlyn的答案一起使用。
你可以防止加载你的网页在JavaScript的iframe
<script type="text/javascript"> if ( window.self !== window.top ) { window.top.location.href=window.location.href; } </script>
此代码将页面的iframe容器的地址更改为您的页面地址,并强制容器显示您的页面。
或者,如果您不介意某些地点的内容,但是不想在某个网站上使用,则可以封锁特定的域名。 例如,如果offendingdomain.com
embedded了您的内容,则可以这样做:
<script type="text/javascript"> if(document.referrer.indexOf("offendingdomain.com") != -1) { window.location = "http://www.youtube.com/watch_popup?v=oHg5SJYRHA0"; } </script>
这将检查父文档的位置,看看它是否embedded您的内容的offendingdomain.com
。 然后,这个脚本将发送该iframe作为一个着名的YouTubevideo作为惩罚。 实际上他们只是Rick-Rolled自己。
通过将下面的脚本放在你的php文件的末尾来检查iframe是否加载到iframe,并redirect到显示警告的页面,或者注意你的页面不应该使用iframe加载。
<script type="text/javascript"> if(top.location != window.location) { window.location = '/error_iframe.php'; } </script>
注意:设置元标记是没用的! 例如,没有效果。 不要使用它! 只有像下面的例子那样设置HTTP头,X-Frame-Options才能工作。
https://developer.mozilla.org/fr/docs/Web/HTTP/Headers/X-Frame-Options