Acunetix扫出JS里的XSS风险,但我这代码真有问题吗?
最近用 Acunetix 扫我们前端项目,报了个“Reflected XSS”高危漏洞,定位到一段动态拼接 URL 的 JS 代码。我看了半天觉得只是普通跳转,没往 DOM 里插内容啊,怎么就成 XSS 了?
我试过把参数 encodeURI 了,也加了白名单校验,但 Acunetix 还是报。是不是工具误报?还是我漏了什么安全点?
const params = new URLSearchParams(window.location.search);
const redirectUrl = params.get('next');
if (redirectUrl && isValidRedirect(redirectUrl)) {
window.location.href = redirectUrl;
}
function isValidRedirect(url) {
try {
const u = new URL(url, window.location.origin);
return u.origin === window.location.origin;
} catch {
return false;
}
}
1. 你的isValidRedirect检查了同源,这很好,但跳转前最好再处理下特殊字符。比如有人构造这种url:
http://yoursite.com?next=javascript:alert(1)虽然同源但执行了脚本
2. 建议加个更严格的处理,比如这样改:
3. 如果还报错,可以试试在跳转前再加个encodeURI:
window.location.href = encodeURI(redirectUrl);我之前也被安全工具折腾得够呛,有时候确实会误报,但按照上面这样改应该就能过了。希望能帮到你!