推荐答案
在 Express 中防止跨站请求伪造 (CSRF) 攻击的推荐方法是使用 csurf 中间件。以下是一个简单的实现示例:
// www.javascriptcn.com code example
const express = require('express');
const csrf = require('csurf');
const cookieParser = require('cookie-parser');
const app = express();
// 使用 cookie-parser 解析 cookie
app.use(cookieParser());
// 设置 CSRF 保护
const csrfProtection = csrf({ cookie: true });
// 在需要 CSRF 保护的请求中使用中间件
app.get('/form', csrfProtection, (req, res) => {
res.render('form', { csrfToken: req.csrfToken() });
});
app.post('/process', csrfProtection, (req, res) => {
res.send('CSRF token is valid');
});
app.listen(3000, () => {
console.log('Server is running on port 3000');
});在这个示例中,csurf 中间件会生成一个 CSRF 令牌,并将其存储在 cookie 中。在表单提交时,前端需要将这个令牌包含在请求中,csurf 中间件会验证这个令牌的有效性。
本题详细解读
什么是 CSRF?
跨站请求伪造 (CSRF) 是一种攻击方式,攻击者通过伪造用户的请求,利用用户的身份执行未经授权的操作。例如,攻击者可以诱使用户点击一个链接,这个链接会向用户的银行网站发送一个转账请求。
为什么需要防止 CSRF?
防止 CSRF 攻击是为了保护用户的敏感操作不被恶意利用。如果网站没有 CSRF 保护,攻击者可以轻松地伪造用户的请求,执行诸如转账、更改密码等操作。
如何使用 csurf 中间件防止 CSRF?
安装依赖:首先需要安装
csurf和cookie-parser中间件。npm install csurf cookie-parser
配置中间件:在 Express 应用中配置
cookie-parser和csurf中间件。const csrfProtection = csrf({ cookie: true });生成 CSRF 令牌:在需要保护的请求中生成 CSRF 令牌,并将其传递给前端。
app.get('/form', csrfProtection, (req, res) => { res.render('form', { csrfToken: req.csrfToken() }); });验证 CSRF 令牌:在提交表单时,
csurf中间件会自动验证 CSRF 令牌的有效性。app.post('/process', csrfProtection, (req, res) => { res.send('CSRF token is valid'); });
前端如何处理 CSRF 令牌?
在前端,通常会将 CSRF 令牌包含在表单的隐藏字段中,或者在 AJAX 请求的头部中传递。
<form action="/process" method="POST"> <input type="hidden" name="_csrf" value="<%= csrfToken %>"> <!-- 其他表单字段 --> <button type="submit">Submit</button> </form>
或者在 AJAX 请求中:
fetch('/process', {
method: 'POST',
headers: {
'X-CSRF-Token': csrfToken
},
body: JSON.stringify({ /* 请求体 */ })
});其他注意事项
- Cookie 配置:确保
csurf中间件的cookie选项设置为true,以便将 CSRF 令牌存储在 cookie 中。 - HTTPS:在生产环境中,确保使用 HTTPS 来传输 CSRF 令牌,以防止中间人攻击。
- 令牌过期:CSRF 令牌通常会有一个有效期,确保在令牌过期时重新生成新的令牌。
通过以上步骤,你可以在 Express 应用中有效地防止 CSRF 攻击。