如何防止Cookie被窃取导致Session劫持?

南宫慧娟 阅读 27

我在开发一个Vue+Node.js的项目时,给Cookie设置了SecureHttpOnly,但测试时发现通过XSS漏洞依然能获取到Session值。比如用户访问恶意链接后,控制台会执行这段代码:


// 模拟攻击代码
alert(document.cookie);

虽然设置了HttpOnly,但为什么还是能读取到Cookie?除了设置SameSite属性,还有哪些具体措施能彻底防止Session劫持?我试过在服务端加随机Token,但不知道该怎么验证前端请求…

我来解答 赞 4 收藏
二维码
手机扫码查看
1 条解答
Mr-艳鑫
Mr-艳鑫 Lv1
你的问题里有个关键点需要澄清,HttpOnly的Cookie是无法通过JavaScript访问的,如果 document.cookie 能读取到,那说明这个Cookie并没有正确设置HttpOnly属性,或者你测试的Cookie并不是HttpOnly的。建议先检查服务端代码,确保设置了正确的标志。

要防止Session劫持,光靠Secure和HttpOnly还不够,这里给你几个优化点:

1. SameSite属性:给Cookie加上SameSite=Strict或SameSite=Lax,这样可以防止跨站请求伪造攻击,同时减少Cookie被第三方网站利用的风险。

2. 绑定用户标识:在服务端生成一个随机Token,比如 csrfToken 或者 sessionToken,并将这个Token绑定到用户的Session中。每次前端请求时,把这个Token放到请求头里,服务端收到后验证Token是否匹配。如果不匹配就直接拒绝请求。

举个例子,在Node.js中你可以这样做:

const crypto = require('crypto');

// 生成随机Token
function generateToken() {
return crypto.randomBytes(16).toString('hex');
}

// 用户登录时设置Token
app.post('/login', (req, res) => {
const sessionToken = generateToken();
req.session.token = sessionToken; // 绑定到Session
res.cookie('sessionToken', sessionToken, { httpOnly: true, secure: true, sameSite: 'strict' });
res.send('Login successful');
});

// 验证Token
function verifyToken(req, res, next) {
const cookieToken = req.cookies.sessionToken;
const sessionToken = req.session.token;
if (!cookieToken || cookieToken !== sessionToken) {
return res.status(403).send('Invalid session');
}
next();
}

// 在敏感接口上使用中间件验证
app.post('/api/sensitive', verifyToken, (req, res) => {
res.send('Access granted');
});


3. IP和User-Agent校验:在用户登录时记录其IP地址和User-Agent,并在后续请求中校验这些信息是否发生变化。如果发现不一致,强制重新登录。这种方法虽然能增加安全性,但可能会误伤一些使用动态IP的用户,所以需要权衡。

4. 缩短Session有效期:把Session的有效期设置得短一些,比如15分钟,然后配合自动刷新机制。这样即使Session被劫持,攻击者也只有很短的时间窗口可以利用。

5. 防御XSS攻击:你提到的XSS漏洞是导致Cookie泄露的根本原因,必须优先解决。检查前端代码,避免直接插入用户输入的内容到DOM中,使用Vue的模板语法来自动转义数据。此外,还可以引入内容安全策略(CSP),限制脚本的执行来源。

最后提醒一下,性能和安全往往是矛盾的,比如频繁生成Token会增加计算开销,但这一步不能省。优化的话,可以把Token生成逻辑放到单独的Worker线程里,减少主线程压力。总之,安全性优先,再谈性能优化。
点赞 1
2026-02-19 18:01