如何通过.htaccess配置CSP限制仅允许自家App嵌入iFrame?
如何通过CSP和辅助请求头锁定移动端App内嵌的iframe内容
一、仅使用CSP限制嵌入来源
完全可以通过CSP的frame-ancestors指令实现你的需求,这个指令专门用来限制哪些页面/上下文可以将当前页面作为iframe嵌入。针对你的场景,配置如下:
Apache服务器配置
在PHP页面所在的虚拟主机配置或.htaccess文件中添加:
Header set Content-Security-Policy "frame-ancestors 'self' *.myDomain.com com.myApp.*;"
'self':允许同域名下的页面嵌入当前PHP内容*.myDomain.com:允许你域名下的所有子域名页面嵌入com.myApp.*:限制只有包名以com.myApp开头的移动端App的WebView能嵌入该内容,这是针对移动端App WebView的专属限制。
Nginx服务器配置
如果用Nginx,在server或location块中添加:
add_header Content-Security-Policy "frame-ancestors 'self' *.myDomain.com com.myApp.*;";
如果需要动态调整CSP(比如根据用户权限),也可以直接在PHP代码中设置响应头:
header("Content-Security-Policy: frame-ancestors 'self' *.myDomain.com com.myApp.*;");
二、结合X-Requested-With请求头增强防护
虽然X-Requested-With不是绝对安全(可被伪造),但作为辅助手段能大幅减少未授权流量。可以将其与CSP结合,实现双重验证:
1. 服务器层面校验请求头
Apache配置(配合mod_rewrite)
在.htaccess或虚拟主机配置中添加:
RewriteEngine On # 检查X-Requested-With头是否为指定值,否则返回403 RewriteCond %{HTTP:X-Requested-With} !^com\.myApp$ [NC] RewriteRule ^ - [F] # 同时设置CSP Header set Content-Security-Policy "frame-ancestors 'self' *.myDomain.com com.myApp.*;"
Nginx配置
在location块中添加:
# 校验X-Requested-With请求头 if ($http_x_requested_with != "com.myApp") { return 403; } add_header Content-Security-Policy "frame-ancestors 'self' *.myDomain.com com.myApp.*;";
2. PHP脚本内校验请求头
如果不想依赖服务器配置,也可以直接在PHP代码里校验:
// 检查请求头是否存在且符合要求 if (!isset($_SERVER['HTTP_X_REQUESTED_WITH']) || $_SERVER['HTTP_X_REQUESTED_WITH'] !== 'com.myApp') { http_response_code(403); exit('Unauthorized'); } // 设置CSP头 header("Content-Security-Policy: frame-ancestors 'self' *.myDomain.com com.myApp.*;"); // 后续输出业务内容
注意事项
- 确保你的App在加载iframe时,确实会发送
X-Requested-With: com.myApp请求头(Android WebView默认携带,iOS WKWebView需要手动设置)。 frame-ancestors不支持IE浏览器,但移动端场景下无需考虑。- 测试时可通过浏览器开发者工具查看CSP响应头是否生效,同时模拟不带指定请求头的请求,确认会被拒绝。
内容的提问来源于stack exchange,提问作者rolinger
相关产品推荐
相关产品推荐

