如何防止Cookie被窃取导致Session劫持? 南宫慧娟 提问于 2026-02-19 17:49:22 阅读 59 安全 我在开发一个Vue+Node.js的项目时,给Cookie设置了Secure和HttpOnly,但测试时发现通过XSS漏洞依然能获取到Session值。比如用户访问恶意链接后,控制台会执行这段代码: // 模拟攻击代码 alert(document.cookie); 虽然设置了HttpOnly,但为什么还是能读取到Cookie?除了设置SameSite属性,还有哪些具体措施能彻底防止Session劫持?我试过在服务端加随机Token,但不知道该怎么验证前端请求… 我来解答 赞 7 收藏 分享 生成中... 手机扫码查看 复制链接 生成海报 反馈 发表解答 您需要先 登录/注册 才能发表解答 1 条解答 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线程里,减少主线程压力。总之,安全性优先,再谈性能优化。 回复 点赞 5 2026-02-19 18:01 加载更多 相关推荐 2 回答 37 浏览 前端设置Cookie时如何防止Session劫持? 我在做登录功能,后端返回了session cookie,但听说如果没设安全属性很容易被XSS偷走。我试过加HttpOnly,但前端又没法读了,现在不知道该怎么平衡安全和功能。 比如我现在登录页的样式是... 慧慧 Dev 安全 2026-03-05 17:04:20 1 回答 47 浏览 前端怎么防止 Session 被劫持?Cookie 设置对了吗? 我最近在做登录功能,后端返回了 Set-Cookie 头,但我担心被 XSS 或中间人攻击偷走 Session。我看文档说要加 HttpOnly 和 Secure,但本地开发用的是 http,加了 S... 慕容志利 安全 2026-03-21 10:59:18 1 回答 31 浏览 前端如何防止Cookie被劫持? 我最近在用Vue做登录功能,后端返回的session cookie好像没加安全属性,担心会被XSS或者中间人攻击偷走。试过在axios里加withCredentials,但不知道前端能不能主动设置co... 皇甫俊凤 安全 2026-03-20 16:32:20 2 回答 50 浏览 React中如何防范Cookie被劫持?我的会话有时会被盗用 我在用React开发登录功能时,发现用户登录后的session_id存放在Cookie里,但最近测试时发现可以通过XSS漏洞直接读取到这个Cookie。虽然设置了HttpOnly和Secure属性,但... UX-瑞雪 安全 2026-02-12 14:26:26 2 回答 29 浏览 Vue项目中如何防止Cookie被劫持导致会话劫持? 我在用Vue做登录功能时发现,用js-cookie保存token的Cookie没设置HttpOnly,这样会不会容易被XSS攻击导致Session劫持? // 登录成功后设置Cookie的代码 met... Code°兴娜 安全 2026-02-17 23:49:24 1 回答 21 浏览 登录后Session ID没变,是不是有Session固定风险? 我最近在做用户登录功能,发现登录前后浏览器里的sessionid Cookie完全一样。查了下资料,说这可能是Session固定攻击的隐患?但我后端是用PHP写的,登录时明明调用了session_re... 程序员炳诺 安全 2026-03-25 09:52:26 1 回答 67 浏览 登录后Session ID没变,是不是有Session固定风险? 我最近在做用户登录功能,发现登录前后浏览器里的sessionid Cookie完全没变。查资料说这可能有Session固定攻击的风险,但我不确定是不是真的有问题。 后端是用PHP写的,登录时只是验证账... 明礼 安全 2026-03-23 02:44:20 2 回答 39 浏览 前端如何防止Cookie被第三方脚本窃取? 我在做登录功能时,后端设置了HttpOnly的Cookie,但还是担心XSS攻击下其他恶意脚本能读取到敏感信息。虽然HttpOnly能阻止JS访问,但如果页面引入了不可信的第三方脚本,会不会有别的泄露... 博主宇硕 安全 2026-03-08 14:43:21 2 回答 61 浏览 Session绑定后怎么还是被CSRF攻击了?我的实现有问题吗? 我在做用户登录时把sessionID存到cookie里,并在服务端把session和用户ID做了绑定。但测试时发现,攻击页面通过已登录的浏览器发起请求,服务端居然能拿到正确的用户信息。我试过设置coo... IT人慧娟 安全 2026-02-03 21:07:40 2 回答 81 浏览 Session固定攻击怎么防?我的登录流程可能有漏洞? 我在开发登录功能时发现,用户登录后会设置session cookie,但测试时发现攻击者可能通过固定session ID来劫持账户。虽然设置了HttpOnly和Secure属性,但测试工具仍能预设se... 南宫锦锦 安全 2026-01-31 20:21:38
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中你可以这样做:
3. IP和User-Agent校验:在用户登录时记录其IP地址和User-Agent,并在后续请求中校验这些信息是否发生变化。如果发现不一致,强制重新登录。这种方法虽然能增加安全性,但可能会误伤一些使用动态IP的用户,所以需要权衡。
4. 缩短Session有效期:把Session的有效期设置得短一些,比如15分钟,然后配合自动刷新机制。这样即使Session被劫持,攻击者也只有很短的时间窗口可以利用。
5. 防御XSS攻击:你提到的XSS漏洞是导致Cookie泄露的根本原因,必须优先解决。检查前端代码,避免直接插入用户输入的内容到DOM中,使用Vue的模板语法来自动转义数据。此外,还可以引入内容安全策略(CSP),限制脚本的执行来源。
最后提醒一下,性能和安全往往是矛盾的,比如频繁生成Token会增加计算开销,但这一步不能省。优化的话,可以把Token生成逻辑放到单独的Worker线程里,减少主线程压力。总之,安全性优先,再谈性能优化。