CORS(跨域资源共享)安全漏洞与防护(实战进阶篇)
字数 1222 2025-11-19 18:35:27
CORS(跨域资源共享)安全漏洞与防护(实战进阶篇)
知识点描述
CORS(跨域资源共享)是一种基于HTTP头的机制,允许服务器声明哪些外部源(域名、协议、端口)可以访问其资源。配置不当会导致严重安全风险,例如将Access-Control-Allow-Origin(ACAO)设置为通配符*或动态信任任意来源,可能泄露敏感数据或允许未授权操作。本专题深入分析实际场景中的错误配置模式及防护方案。
逐步讲解
-
CORS核心机制回顾
- 浏览器发起跨域请求时,自动添加
Origin头(如Origin: https://evil.com)。 - 服务器通过
Access-Control-Allow-Origin(ACAO)响应头指定允许的源。若为*,表示允许所有源;若为具体域名,则仅允许该源。 - 对于携带凭证(Cookie/Auth头)的请求,服务器需设置
Access-Control-Allow-Credentials: true,且ACAO不能为*。
- 浏览器发起跨域请求时,自动添加
-
常见漏洞场景分析
-
场景1:动态ACAO信任任意Origin
- 漏洞代码示例(Node.js):
app.use((req, res) => { const origin = req.headers.origin; res.setHeader('Access-Control-Allow-Origin', origin); // 直接回显请求的Origin res.setHeader('Access-Control-Allow-Credentials', 'true'); }); - 风险:攻击者可伪造任意Origin获取数据,例如通过恶意网站发起跨域请求窃取用户信息。
- 漏洞代码示例(Node.js):
-
场景2:宽松的正则匹配
- 错误配置:检查Origin是否包含
example.com(如允许attacker-example.com)。 - 风险:子域名或相似域名可越权访问。
- 错误配置:检查Origin是否包含
-
场景3:预检请求(Preflight)缺失验证
- 复杂请求(如Content-Type非简单值)会先发OPTIONS预检请求。若服务器对OPTIONS请求缺乏验证,可能绕过限制。
-
-
攻击案例演示
- 假设API端点
https://api.target.com/userinfo返回用户敏感数据,且配置为动态ACAO。 - 攻击者在
https://evil.com部署以下代码:<script> fetch('https://api.target.com/userinfo', { credentials: 'include' // 携带用户Cookie }) .then(response => response.json()) .then(data => sendToAttacker(data)); </script> - 用户访问
evil.com时,浏览器自动携带Target域的Cookie发起请求,服务器返回数据并被攻击者捕获。
- 假设API端点
-
防护方案
- 严格校验Origin:使用白名单机制,仅允许可信域名。示例代码:
const allowedOrigins = ['https://app.target.com', 'https://admin.target.com']; app.use((req, res) => { const origin = req.headers.origin; if (allowedOrigins.includes(origin)) { res.setHeader('Access-Control-Allow-Origin', origin); res.setHeader('Access-Control-Allow-Credentials', 'true'); } }); - 避免动态信任:禁止直接反射Origin,尤其当请求含凭证时。
- 限制方法/头:通过
Access-Control-Allow-Methods和Access-Control-Allow-Headers缩小允许范围。 - 预检请求加固:对OPTIONS请求实施与主请求相同的认证逻辑。
- 严格校验Origin:使用白名单机制,仅允许可信域名。示例代码:
-
进阶防护技巧
- Vary头设置:添加
Vary: Origin避免缓存污染。 - 敏感接口本地访问限制:通过检查
Origin是否为null或file://协议,阻止本地恶意文件访问。 - 监控异常Origin:日志记录非法Origin请求,及时发现攻击试探。
- Vary头设置:添加
通过以上步骤,可系统化解决CORS配置导致的安全问题,平衡跨域需求与安全性。