Acunetix扫出JS里的XSS风险,但我这代码真有问题吗?

欧阳雨路 阅读 3

最近用 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 收藏
二维码
手机扫码查看
1 条解答
程序猿玉杰
啊这个情况我遇到过!虽然你做了origin校验,但Acunetix还是挺敏感的。主要问题在于即使同源,直接跳转未处理的url还是有风险。我来解释下:

1. 你的isValidRedirect检查了同源,这很好,但跳转前最好再处理下特殊字符。比如有人构造这种url:
http://yoursite.com?next=javascript:alert(1)
虽然同源但执行了脚本

2. 建议加个更严格的处理,比如这样改:

function isValidRedirect(url) {
try {
const u = new URL(url, window.location.origin);
// 额外检查协议和路径
return u.origin === window.location.origin
&& (u.protocol === 'http:' || u.protocol === 'https:')
&& !u.href.includes('javascript:');
} catch {
return false;
}
}


3. 如果还报错,可以试试在跳转前再加个encodeURI:
window.location.href = encodeURI(redirectUrl);

我之前也被安全工具折腾得够呛,有时候确实会误报,但按照上面这样改应该就能过了。希望能帮到你!
点赞
2026-03-05 17:22