Apache 2.4 配置仅允许同服务器其他域名访问指定内嵌页面
问题原因
你之前尝试的基于IP/host的访问控制不生效,是因为无论用户直接访问站点,还是xxx.subdomain.com的页面在用户端加载内嵌iframe,请求的源IP都是用户的客户端IP,规则无法区分两种请求场景。
解决方案
采用CSP安全头+Referer校验的双重防护方案,无需修改业务代码即可实现需求,修改后的虚拟主机配置如下:
<VirtualHost 127.0.0.1:443 _default_:443> ServerAlias yyy.subdomain.com SSLEngine on SSLCertificateFile "/opt/user/apache/conf/certs/server.crt" SSLCertificateKeyFile "/opt/user/apache/conf/certs/server.key" DocumentRoot /opt/bitnami/apache/htdocs/yyy # 配置CSP规则,仅允许同根域名下的站点内嵌当前页面,可修改为精确地址https://xxx.subdomain.com限制更严格 Header always set Content-Security-Policy "frame-ancestors 'self' https://*.subdomain.com;" <Directory "/opt/bitnami/apache/htdocs/yyy"> Options Indexes FollowSymLinks MultiViews AllowOverride All RewriteEngine On # 校验请求来源,仅允许来自subdomain.com域名下的请求访问,空Referer(用户直接输入地址)直接拦截 RewriteCond %{HTTP_REFERER} !^https://.*\.subdomain\.com(/.*)?$ [NC] RewriteRule ^ - [F,L] </Directory> </VirtualHost>
生效说明
- 若你的站点使用HTTP协议,将配置中的
https替换为http即可 - 配置修改完成后,重启Apache服务生效,Bitnami环境默认重启命令为:
sudo /opt/bitnami/ctlscript.sh restart apache
可选增强方案
如果需要更高安全性,可在业务层增加签名校验:xxx.subdomain.com生成页面时,给iframe的url追加一次性签名参数,yyy.subdomain.com校验签名合法后才返回内容,可完全避免Referer被伪造、被禁用的极端场景。
内容的提问来源于stack exchange,提问作者cdiegobb
相关产品推荐
相关产品推荐

