如何防止Cookie被窃取导致Session劫持? 南宫慧娟 提问于 2026-02-19 17:49:22 阅读 27 安全 我在开发一个Vue+Node.js的项目时,给Cookie设置了Secure和HttpOnly,但测试时发现通过XSS漏洞依然能获取到Session值。比如用户访问恶意链接后,控制台会执行这段代码: // 模拟攻击代码 alert(document.cookie); 虽然设置了HttpOnly,但为什么还是能读取到Cookie?除了设置SameSite属性,还有哪些具体措施能彻底防止Session劫持?我试过在服务端加随机Token,但不知道该怎么验证前端请求… 我来解答 赞 4 收藏 分享 生成中... 手机扫码查看 复制链接 生成海报 反馈 发表解答 您需要先 登录/注册 才能发表解答 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线程里,减少主线程压力。总之,安全性优先,再谈性能优化。 回复 点赞 1 2026-02-19 18:01 加载更多 相关推荐 2 回答 11 浏览 React中如何防范Cookie被劫持?我的会话有时会被盗用 我在用React开发登录功能时,发现用户登录后的session_id存放在Cookie里,但最近测试时发现可以通过XSS漏洞直接读取到这个Cookie。虽然设置了HttpOnly和Secure属性,但... UX-瑞雪 安全 2026-02-12 14:26:26 1 回答 5 浏览 Vue项目中如何防止Cookie被劫持导致会话劫持? 我在用Vue做登录功能时发现,用js-cookie保存token的Cookie没设置HttpOnly,这样会不会容易被XSS攻击导致Session劫持? // 登录成功后设置Cookie的代码 met... Code°兴娜 安全 2026-02-17 23:49:24 2 回答 28 浏览 Session绑定后怎么还是被CSRF攻击了?我的实现有问题吗? 我在做用户登录时把sessionID存到cookie里,并在服务端把session和用户ID做了绑定。但测试时发现,攻击页面通过已登录的浏览器发起请求,服务端居然能拿到正确的用户信息。我试过设置coo... IT人慧娟 安全 2026-02-03 21:07:40 2 回答 42 浏览 Session固定攻击怎么防?我的登录流程可能有漏洞? 我在开发登录功能时发现,用户登录后会设置session cookie,但测试时发现攻击者可能通过固定session ID来劫持账户。虽然设置了HttpOnly和Secure属性,但测试工具仍能预设se... 南宫锦锦 安全 2026-01-31 20:21:38 1 回答 19 浏览 React中如何验证Cookie数据未被篡改? 我在React项目里用js-cookie设置cookie,但不确定怎么防止别人篡改内容?比如这个登录token: import Cookies from 'js-cookie'; ... 敏涵 安全 2026-02-05 20:48:28 2 回答 74 浏览 Double Submit Cookie如何防止CSRF攻击?我的实现总出现跨域问题怎么办? 我按照教程实现了双重提交Cookie,后端设置了CSRF-TOKEN到Cookie和响应头,前端在请求头带上这个Token。但测试时发现,跨域请求时浏览器报“Blocked cookie with s... シ莉莉 安全 2026-02-03 20:16:34 2 回答 21 浏览 Persistent Cookie设置Secure后为何还能被XSS窃取? 我在前端设置了持久化Cookie时添加了Secure; HttpOnly属性,但PenTest工具显示XSS脚本仍能读取到cookie值。测试时发现当页面存在注入点时,攻击者通过document.co... 东方熙炫 安全 2026-02-06 20:06:29 2 回答 73 浏览 如何确保Cookie内容不被篡改?Secure+HttpOnly还不够吗? 在开发登录功能时,我设置了Cookie的Secure和HttpOnly属性,但测试发现攻击者仍能修改Cookie中的role字段(比如把普通用户改成管理员)。除了用HTTPS加密传输,还有哪些方法能验... 博主柯欣 安全 2026-01-29 17:25:59 2 回答 62 浏览 如何确保前端Cookie内容没有被篡改? 最近在做用户登录功能时发现,如果直接用document.cookie = "userId=123",怎么防止中间人修改Cookie里的userId呢? 试过给Cookie加了加密,但后来想到就算加密了... 柯福 Dev 安全 2026-01-28 09:35:32 2 回答 17 浏览 怎样正确实现双提交Cookie来防御CS 最近在学习用Double Submit Cookie方法来增强网站的安全性,防止CSRF攻击。但是,在实际操作过程中遇到了些问题。我的做法是在用户登录时生成一个随机token存储于cookie中,并且... Dev · 含平 安全 2026-01-25 02:55:33
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线程里,减少主线程压力。总之,安全性优先,再谈性能优化。