JSONP 为什么是风险面
JSONP 通过 callback 参数把数据包裹成脚本片段返给浏览器,因此任何站点都能通过 script 标签跨域读取返回内容——这是设计使然,不是配置失误。风险在于它常被用在带登录态的接口上:用户在浏览器里的会话会让 JSONP 返回本人数据,而读取方可以是任意第三方页面。新接口不应再使用 JSONP,存量接口需要收缩到无敏感数据场景并严格校验回调名。
基本信息
| 适用平台 | 遗留 Web 前端与老版本开放接口 |
|---|---|
| 识别特征 | 接口含 callback/cb/jsonp 参数,返回包裹式脚本文本 |
| 风险本质 | 跨域可读,且可能携带用户登录态数据 |
| 参考标准 | OWASP WSTG-CLNT-12、CWE-79 相关实践 |
典型使用场景
- 老系统接口资产梳理时识别遗留 JSONP 端点
- 评估登录态接口是否同时提供了跨域可读的 JSONP 出口
- 排查回调名未校验导致的可注入脚本问题
- 为前端改造(迁移到 CORS)提供影响面清单
- 核查第三方合作方是否仍在调用 JSONP 接口
检查步骤
检查步骤
1. 从接口清单与前端代码中收集含 callback/cb/jsonp 参数的端点
2. 用自有测试页面尝试跨域读取(只读取测试账号自身的数据)
3. 检查回调名是否允许任意字符(特殊符号进入响应体会形成脚本注入)
4. 对比返回内容:是否包含超出前端展示需要的信息
5. 记录端点、返回数据类型与是否携带会话信息,输出改造建议检查点与判据
| 检查点 | 正常状态 | 风险表现 |
|---|---|---|
| 接口是否仍在使用 | 已迁移到 CORS 或新方案 | 大量遗留端点在网 |
| 数据敏感度 | 仅公开非敏感数据 | 带登录态返回用户数据 |
| 回调名校验 | 严格白名单字符集 | 任意字符可注入响应体 |
| 会话依赖 | 不依赖 Cookie 鉴权 | 跨域请求自动携带登录态 |
| 调用方识别 | 有明确合作方登记 | 无登记也无法关闭 |
修复视角:新接口一律不用 JSONP,改用按来源白名单配置的 CORS;存量接口收缩到无敏感数据场景,并把回调名限制为字母数字与下划线的白名单字符集。
用公开数据端点测试会得出“无风险”的错误结论:判断时必须确认该端点在携带会话时是否返回用户相关数据。