JSONP还能用吗?为什么现在都说是安全风险?
最近在重构一个老项目,发现它还在用 JSONP 跨域请求第三方数据。我查了下资料,说 JSONP 有 XSS 风险,但又没太明白具体怎么出问题的。我自己试着重构成 fetch + CORS,但对方接口不支持 OPTIONS 预检,直接被浏览器拦了。
现在纠结要不要继续用 JSONP,毕竟功能是能跑的。下面是我现在用的 React 代码:
useEffect(() => {
const script = document.createElement('script');
script.src = <code>https://api.example.com/data?callback=handleResponse</code>;
document.body.appendChild(script);
window.handleResponse = (data) => {
setData(data);
};
return () => {
document.body.removeChild(script);
delete window.handleResponse;
};
}, []);
这种写法到底哪里不安全?有没有更稳妥的替代方案?
注入,第三方接口一旦被黑或者返回恶意 JS,你的站点直接中招。你那段代码里把handleResponse挂在window上是典型 XSS 漏洞入口——攻击者能通过 URL 参数注入任意回调名,比如?callback=alert(document.cookie),浏览器照单全收执行。真正稳妥的方案:让后端做代理。前端请求自己后端,后端用服务器去调第三方接口(绕过 CORS),再把结果返给前端。代码示例:
后端用 Node/PHP/Java 都行,就一句:转发请求 + 设置
Origin头(或直接用curl/axios)。第三方接口不支持 CORS?关我前端啥事,我后端本来就不受浏览器限制。