JSONP还有人用吗?它到底有什么安全风险?

Mr-小青 阅读 16

最近在维护一个老项目,发现接口还在用 JSONP 跨域,但听说这玩意儿很不安全。我试着改成 fetch + CORS,但后端没配 Access-Control-Allow-Origin,直接被拦了。

现在纠结要不要继续用 JSONP,比如像这样:$.ajax({ url: 'xxx', dataType: 'jsonp' }),但又担心被 XSS 攻击。有没有实际案例说明它到底危险在哪?

如果必须用 JSONP,至少该怎么写才稍微安全点?比如对回调函数名做校验之类的?

我来解答 赞 2 收藏
二维码
手机扫码查看
1 条解答
宇文海利
JSONP确实已经过时了,现在主流方案是CORS或者后端代理。

JSONP的安全风险主要在这几个方面:

第一,没有机制阻止恶意站点调用。JSONP本质是动态创建script标签,浏览器对script标签的跨域请求没有同源限制,服务端返回啥浏览器就执行啥。这意味着任何网站都可以调用你的JSONP接口,攻击者可以构造一个页面诱导用户访问,然后神不知鬼不觉地调用你的接口。

第二,XSS风险。如果攻击者控制了JSONP返回的数据(比如通过URL参数注入),可以直接在返回内容里插入恶意JS代码,用户访问时就会执行。

第三,CSRF风险。JSONP请求会带上用户的cookie,攻击者可以诱导用户发送带有认证信息的请求。

实际案例的话,早年12306、淘宝等网站都曝出过通过JSONP泄露用户信息的漏洞,攻击者只需要构造一个URL让已登录用户访问,就能拿到他们的数据。

如果非用JSONP不可,防护措施:

对回调函数名严格限制,只能是字母数字下划线,禁止特殊字符,可以用正则 /^[a-zA-Z0-9_]+$/ 这样过滤。

验证Referer或者Origin请求头,虽然可以被伪造,但能挡住大部分直接访问。

接口加上token验证,别完全依赖cookie。

但说真的,能不用就别用。

你后端没配CORS的话,最简单的办法是让后端配一下,就加一个响应头 Access-Control-Allow-Origin: 你的域名,如果是需要带cookie的跨域,那就要配 Access-Control-Allow-Credentials: true,同时Origin不能是通配符。

如果后端实在不配合,你还可以搞个后端代理,让前端请求同源的后端服务,后端再去调第三方接口返回给你。这样就不涉及跨域了。
点赞
2026-03-11 23:13