JSONP 漏洞
JSONP 漏洞介绍
JSONP (JSON with Padding) 是一种用于跨域数据请求的技术,通常用于绕过浏览器的同源策略(Same-Origin Policy)。它通过动态创建 <script>
标签来加载外部资源,并利用回调函数处理返回的数据。
漏洞原理
JSONP 的漏洞主要源于以下问题:
- 缺乏输入验证:如果服务器未对回调函数名进行严格的验证,攻击者可以注入恶意代码。
- 数据泄露:JSONP 返回的数据可能包含敏感信息,如果未正确限制访问,可能导致信息泄露。
- 跨站脚本攻击 (XSS):如果回调函数名或返回的数据未经过滤,攻击者可以注入恶意脚本,导致 XSS 攻击。
漏洞示例
假设一个 JSONP 接口如下:
http://example.com/api?callback=myCallback
返回的数据格式为:
myCallback({"data": "sensitive information"});
如果攻击者构造一个恶意的回调函数名,例如:
http://example.com/api?callback=alert('XSS');
服务器返回:
alert('XSS')({"data": "sensitive information"});
这会导致 XSS 攻击。
解决方法
-
禁用 JSONP
- 如果可能,完全禁用 JSONP,改用更安全的跨域技术,如 CORS (Cross-Origin Resource Sharing)。
-
严格验证回调函数名
- 限制回调函数名只能包含字母、数字和下划线,并设置最大长度。
- 示例:
const callback = req.query.callback; if (!/^[a-zA-Z0-9_]+$/.test(callback)) { return res.status(400).send("Invalid callback name"); }
-
返回固定格式的 JSONP
- 确保返回的数据始终是 JSON 格式,并在回调函数中包裹。
- 示例:
const data = { "data": "sensitive information" }; res.send(`${callback}(${JSON.stringify(data)})`);
-
限制敏感数据
- 避免通过 JSONP 返回敏感信息,如用户凭证、个人隐私等。
-
使用 HTTPS
- 确保 JSONP 接口通过 HTTPS 传输,防止数据被中间人攻击窃取。
-
设置 Content-Type
- 确保返回的 Content-Type 为
application/javascript
,而不是text/html
,以防止浏览器将响应解析为 HTML。
- 确保返回的 Content-Type 为
-
使用 CSP (Content Security Policy)
- 通过 CSP 限制脚本的来源,防止恶意脚本的执行。
- 示例:
Content-Security-Policy: script-src 'self';
总结
JSONP 是一种过时的跨域技术,存在较大的安全风险。建议优先使用 CORS 等更安全的替代方案。如果必须使用 JSONP,务必严格验证输入、限制敏感数据,并采取其他安全措施来降低风险。