乐闻世界logo
搜索文章和话题

如何在 Nodejs 中防止 CSRF 攻击?

1 个月前提问
1 个月前修改
浏览次数13

1个答案

1

在Node.js环境中,防止跨站请求伪造(CSRF)攻击主要可以通过以下几个策略实现:

1. 使用CSRF Tokens

CSRF Token是一种常见的防护手段。服务器在生成表单时创建一个随机的token,并将这个token发送到客户端的表单中。当表单提交时,客户端必须将这个token一同提交。服务器会验证这个token是否有效,只有验证通过的请求才会被接受。

示例:

在Node.js中,可以使用csurf这个中间件来轻松实现CSRF保护。以下是如何在Express.js应用中使用csurf的基本步骤:

javascript
const express = require('express'); const csrf = require('csurf'); const bodyParser = require('body-parser'); const cookieParser = require('cookie-parser'); const app = express(); // 使用cookie-parser中间件 app.use(cookieParser()); // 设置body-parser来解析请求体 app.use(bodyParser.urlencoded({ extended: false })); // 设置CSRF保护 const csrfProtection = csrf({ cookie: true }); app.get('/form', csrfProtection, (req, res) => { // 发送包含CSRF token的表单 res.send(`<form action="/submit" method="POST"> <input type="hidden" name="_csrf" value="${req.csrfToken()}"> <button type="submit">Submit</button> </form>`); }); app.post('/submit', csrfProtection, (req, res) => { res.send('Data is being processed'); }); app.listen(3000, () => console.log('App listening on port 3000'));

2. SameSite Cookie属性

通过设置Cookies的SameSite属性,可以让浏览器只在同源请求时发送Cookies,从而防止CSRF攻击。SameSite可以设置为StrictLax,推荐使用Strict模式以获得最高的安全性。

示例:

javascript
const session = require('express-session'); app.use(session({ secret: 'your_secret_key', resave: false, saveUninitialized: true, cookie: { sameSite: 'strict' } }));

3. 验证Referer或Origin头

通过检查HTTP请求的RefererOrigin头部,可以识别请求是否来自于可信的源。如果头部信息与预期的来源不符,可以拒绝该请求。

示例:

javascript
function checkReferer(req, res, next) { const allowedOrigins = ['https://www.yourdomain.com']; const referer = req.headers.referer; if (allowedOrigins.includes(new URL(referer).origin)) { next(); } else { res.status(403).send('Security Check Failed'); } } app.post('/secure-action', checkReferer, (req, res) => { res.send('Action completed successfully'); });

通过这些方法的结合使用,可以有效地增强Node.js应用的安全性,防止CSRF攻击。在实际应用中,需要根据具体的业务需求和应用场景选择合适的防护策略。

2024年8月8日 01:49 回复

你的答案