点击劫持Self检测为啥不生效?

___爱欢 阅读 3

我在页面里加了X-Frame-Options: SAMEORIGIN,但用iframe嵌套自己域名的页面还是被拦了,这不应该是允许的吗?

试过在Nginx里配:add_header X-Frame-Options "SAMEORIGIN";,也试过在HTML里加meta标签,但都没用。控制台还报错“Refused to display in a frame because it set ‘X-Frame-Options’ to ‘sameorigin’.”,可我明明是在同一个域下啊!

是不是我理解错了SAMEORIGIN的意思?或者还有其他配置冲突了?

我来解答 赞 4 收藏
二维码
手机扫码查看
1 条解答
慕容梦幻
这个问题我之前也踩过坑,其实有两个常见原因导致你这种情况。

第一个坑,HTML里的meta标签根本没法控制X-Frame-Options,这个响应头只能通过服务端返回,meta标签写了也白写,直接忽略。所以你在HTML里加的那个配置可以删掉了,没用。

第二个坑,你对"同源"的理解可能有偏差。SAMEORIGIN要求的是协议、域名、端口完全一致,缺一不可。常见的坑是这几个情况:主页面是 https://example.com,iframe里嵌的是 https://www.example.com,带www和不带www虽然看起来是同一个网站,但浏览器判定为跨域。还有http和https混用,或者端口不同,比如80和8080,这些都会被判定为不同源。

排查的时候先打开浏览器开发者工具的Network面板,看iframe请求的Response Headers里X-Frame-Options是不是真的生效了。如果Nginx配置了但没生效,可能是配置位置不对,要放在server块或者location块里面,别乱放。

正确的Nginx配置大概是这样:

server {
listen 80;
server_name example.com;

add_header X-Frame-Options "SAMEORIGIN";

location / {
# 其他配置
}
}


如果确认域名端口协议都一致,还是被拦截,检查一下是不是同时配了CSP的frame-ancestors,这个优先级比X-Frame-Options高,会覆盖掉你的配置。CSP里如果写了frame-ancestors 'none'之类的,那肯定会被拦。

通用的做法是把主页面和iframe页面的域名统一一下,或者用CSP的frame-ancestors来替代X-Frame-Options,CSP支持配置多个域名,更灵活一些。
点赞
2026-03-01 13:01