在 Web 应用程序中,CSRF(Cross-Site Request Forgery)攻击是一种常见的安全威胁,它会利用用户已经登录的身份来发送恶意请求,从而导致用户的账户被攻击者控制。Node.js 作为一种常用的后端开发语言,也需要注意防御 CSRF 攻击。本文将介绍如何在 Node.js 中防御这种攻击,并提供示例代码和指导意义。
CSRF 攻击的原理
CSRF 攻击的原理是利用用户已经登录的身份,向服务器发送伪造的请求。攻击者会在另一个网站上放置一个恶意链接,当用户点击该链接时,会向服务器发送一个伪造的请求。由于用户已经登录,服务器会认为这是一个合法的请求,从而执行该请求,导致用户的账户被攻击者控制。
防御 CSRF 攻击的方法
防御 CSRF 攻击的方法主要有以下几种:
1. 验证请求来源
在服务器端,可以验证请求的来源是否合法。如果请求的来源不是本站点,就可以拒绝该请求。可以通过验证请求头中的 Referer 字段来实现。
if (req.headers.referer !== 'https://www.example.com/') { res.status(403).send('Forbidden'); return; }
2. 添加 CSRF Token
在每次请求时,服务器可以生成一个随机的 CSRF Token,并将其存储在会话中。在接下来的请求中,客户端需要将该 Token 发送到服务器,服务器验证该 Token 是否合法。如果不合法,服务器将拒绝该请求。
// javascriptcn.com 代码示例 // 生成 CSRF Token app.use((req, res, next) => { if (!req.session.csrfToken) { req.session.csrfToken = crypto.randomBytes(16).toString('hex'); } next(); }); // 在表单中添加 CSRF Token app.get('/form', (req, res) => { res.render('form', { csrfToken: req.session.csrfToken }); }); // 验证 CSRF Token app.post('/submit', (req, res) => { if (req.body.csrfToken !== req.session.csrfToken) { res.status(403).send('Forbidden'); return; } // 处理表单提交 });
3. 添加 SameSite 属性
在 Cookie 中添加 SameSite 属性可以限制 Cookie 的跨站访问,从而防止 CSRF 攻击。SameSite 属性有三个值可选:Strict、Lax 和 None。其中,Strict 表示完全禁止 Cookie 跨站访问,Lax 表示只允许 GET 请求跨站访问,None 表示不限制跨站访问。
app.use(session({ secret: 'my secret', cookie: { sameSite: 'strict', secure: true, }, }));
总结
在 Node.js 中防御 CSRF 攻击可以通过验证请求来源、添加 CSRF Token 和添加 SameSite 属性等方法来实现。开发者需要根据具体的业务需求选择合适的方法来防御 CSRF 攻击。同时,开发者还需要注意定期更新依赖库,以保证应用程序的安全性。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/65073b6495b1f8cacd2bddbb