CSP 的 frame-ancestors 设置后为什么还是被嵌入了?
我在项目里加了 Content-Security-Policy 响应头,设置了 frame-ancestors 'self',按理说第三方网站不应该能用 iframe 嵌入我的页面,但测试时发现还是可以被嵌入,完全没生效,是不是哪里写错了?
我检查过响应头确实返回了 CSP 策略,也试过在 HTML 里用 meta 标签设置,结果一样。下面是我在服务器返回的 CSP 头对应的策略片段(简化后):
/* 这是模拟的 CSP 策略效果,实际为 HTTP 头 */
Content-Security-Policy: frame-ancestors 'self';
难道是因为用了 meta 标签?还是浏览器兼容问题?Chrome 最新版测的。
另外有个容易忽略的地方,就是如果页面是 HTTPS,嵌入源是 HTTP 或者反过来,这种混合内容情况可能会导致策略失效。再检查下你的请求和嵌入页面的协议是否一致。
还有个 WordPress 特有的情况,如果你用了缓存插件或者 CDN,可能返回的响应头不是最新的。我建议直接在服务器配置里加 CSP 头,而不是依赖插件。比如用 Nginx 可以这样:
要是还不好使,试试把策略写完整点,加上 default-src 'none' 这种,排除其他干扰因素。折腾安全策略真是个体力活,不过慢慢调总会搞定的。