JavaScript协议链接会被XSS攻击吗?怎么防?
我在项目里有个地方要动态生成超链接,用户可以输入URL,但我发现如果输入 javascript:alert(1) 这种,点击就会执行脚本,这算XSS漏洞吧?
我试过用正则过滤 javascript:,但担心有绕过方式。有没有更稳妥的处理方法?比如只允许 http/https 协议?
现在代码大概是这样:
function createLink(url) {
const a = document.createElement('a');
a.href = url;
a.textContent = '点击跳转';
return a;
}
javascript:的思路是对的,但确实容易被绕过,比如JAVASCRIPT:、javascript:、java script:(中间加制表符)等各种骚操作,防不胜防。更稳妥的做法是用白名单机制,只允许
http和https协议。可以利用浏览器原生的 URL 解析能力来做校验:几个关键点说下。
new URL()会自动帮你处理编码、大小写等问题,解析出来的protocol是标准化的,不存在绕过的可能。白名单思维永远比黑名单靠谱,你不需要去猜黑客有多少种绕过姿势。注意安全,还有个细节容易忽略:给外链加上
rel="noopener noreferrer"。不然目标页面可以通过window.opener操纵你的源页面,这叫 tabnabbing 攻击,虽然不是 XSS,但也是个安全隐患。另外如果你的业务需要支持相对路径,第二个参数
window.location.href作为 base URL 会帮你正确解析。如果只允许绝对路径的外链,可以把 base 参数去掉,解析失败就当非法处理。