如何使用 Express JS 4.0 的 csurf?

8

我一直在查看csurf的维基,但它是空的。该模块向用户请求添加了一个csrfToken()函数,但我应该如何使用它呢?

可以有人给出带有解释的代码示例吗?用户端和服务器端我应该做什么?

1个回答

5
csurf 中间件的设计目的是拒绝包含有效令牌的请求,如果请求没有有效令牌,则会拒绝请求中的有效载荷(例如,请求体参数)。以下是如何使用它的方法:
app.use(require('body-parser')());
app.use(require('cookie-parser')('YOUR SECRET GOES HERE'));
app.use(require('express-session')());

app.use(require('csurf')());

app.get('/some-form', function(req, res){
    res.send('<form action="/process" method="POST">' +
        '<input type="hidden" name="_csrf" value="' + req.csrfToken() + '">' +
        'Favorite color: <input type="text" name="favoriteColor">' +
        '<button type="submit">Submit</button>' +
        '</form>');
});

app.post('/process', function(req, res){
    res.send('<p>Your favorite color is "' + req.body.favoriteColor + '".');
});

尝试去掉req.csrfToken()(或用其他东西替换它),您会发现表单不再起作用。

请注意,您需要使用会话才能使csurf正常工作。如果您想了解为什么要使用csurf,请参阅维基百科上关于跨站请求伪造(CSRF)的文章。


在 app.post 中,我需要检查 csrfToken 吗? - Paresh Gami
不,Paresh,csurf 中间件会为您处理这个问题。如果 '_csrf' 字段不存在或不正确,则会在您的 'post' 处理程序之前被拒绝。 - Ethan Brown
感谢您的快速回复。我正在使用express.js返回带有_csrf令牌的index.html,并在angular前端中获取cookie并将其设置在form标签中与_csrf一起,并从cookie设置令牌到隐藏状态,现在我按提交按钮,但令牌始终返回EBADCSRFTOKEN。请告诉我我错在哪里。 - Paresh Gami
我正在检查req.body中是否存在csrf令牌,同时我也在检查浏览器cookie值是否与传递的值匹配,但它仍然拒绝请求。 - Paresh Gami
我无法从您的描述中完全理解,Paresh。也许您可以尝试使用您的应用程序文件和表单源文件提出一个新问题? - Ethan Brown
我只是托管了网站https://tranquil-earth-4097.herokuapp.com/login。在检查元素>资源> cookie中,您可以看到cookie已成功存储。现在我正在发布我的index.js代码。请参见此bin http://pastebin.com/Uvkj4ZH4。感谢您的帮助。@Ethan Brown - Paresh Gami

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接