通过htaccess配置CSP拦截除defend.net外所有iframe的方案咨询
最安全有效的实现方案
首先需要修正一个配置误区:你当前配置中使用的frame-src是用来控制你的站点页面内可以嵌入哪些第三方iframe资源,并不能限制其他站点嵌入你的页面。实现后者需求应该用CSP的frame-ancestors指令,这也是W3C官方指定替代已弃用的X-Frame-Options的标准方案。
修正后的完整htaccess配置如下:
<IfModule mod_headers.c> Header set X-XSS-Protection "1; mode=block" # 不需要兼容上古浏览器可直接删除下一行X-Frame-Options配置 # Header set X-Frame-Options "SAMEORIGIN" Header set X-Content-Type-Options "nosniff" Header always set Strict-Transport-Security "max-age=63072000; includeSubDomains" # 修正后的CSP配置,frame-ancestors用于控制可嵌入你站点的来源 Header always set Content-Security-Policy "frame-ancestors 'self' https://*.defend.net;" Header set Referrer-Policy "same-origin" </IfModule>
修改说明:
- 把
Header add改成Header always set,避免服务器返回重复的CSP头导致规则失效 - 替换
frame-src为frame-ancestors,匹配你要限制站点嵌入的需求 - 去掉
https://*.defend.net两侧多余的单引号,CSP中只有self这类关键字需要加单引号,普通源地址不需要 - 如果你的站点本身也需要在页面内嵌入其他iframe资源,可以在CSP中同时保留
frame-src指令,和frame-ancestors用分号分隔即可,两者功能互不冲突
关于X-Frame-Options配置是否可以删除
可以安全删除,原因如下:
- 所有主流现代浏览器(Chrome 40+、Firefox 33+、Safari 10+、Edge 15+)都完全支持
frame-ancestors指令,且CSP头的优先级高于X-Frame-Options,只要配置了正确的frame-ancestors,原有防护效果不会受任何影响 - 你当前配置的
X-Frame-Options: SAMEORIGIN本身和你的需求冲突:它只允许同域站点嵌入你的页面,会导致*.defend.net在不支持CSP的超老旧浏览器中也无法正常嵌入你的站点 - 已弃用的
ALLOW-FROM指令只有极少部分老旧浏览器支持,对现在的用户群体来说兼容价值极低,不需要保留
内容的提问来源于stack exchange,提问作者Tim M
相关产品推荐
相关产品推荐

