当前位置: 首页 > 知识库问答 >
问题:

如何传递csrf令牌在所有视图中的Express,nodejs

勾海超
2023-03-14

我有一个使用ExpressJS构建的NodeJS应用程序。在安全审查之后,有人建议我在所有表单和ajax提交上实现CSRF。为此,我使用了csurf包。为此,我们需要在每个表单页面中传递CSRF令牌,然后将其与表单提交数据一起返回。

首先,我尝试对包含表单的页面单独执行此操作。但后来我意识到我的页面标题中有一个搜索表单,它出现在所有页面上。现在,是否有任何方法可以将CSRF令牌传递给我的所有视图,而无需为每个请求显式传递它。下面是我用来呈现表单页面的通用html" target="_blank">代码。我使用Jade/Pug进行渲染:

router.get('/createcampaign', checkUserSession, middleWare2, middleware3, function(req, res){
    var pageInfo = {};
    pageInfo.title = 'Create New Campaign';
    pageInfo.projects = req.projects;
    pageInfo.session = req.session;
    pageInfo.bodyid = 'createcampaign';
    pageInfo.project_id = req.flash('project_id');
    pageInfo.bodyclass = 'bluebody';
    pageInfo.account = req.account;
    pageInfo.grammars = req.grammars;
    pageInfo.csrfToken = req.csrfToken; //Here I pass csrfToken to view

    res.render( 'users/createcampaign', pageInfo );
});//createcampaign get route

如您所见,我需要传递带有view上下文对象的csrfToken。我如何全局传递它,以便将其传递给所有视图?

谢谢

共有1个答案

钱卓君
2023-03-14
create a middleware that will pass a token to the token property to the request object
var csrf = require('csurf')   
app.use(csrf())
app.use(function(request,response,next){
    app.locals._token = request.csrfToken()
    next() 
})

and you can use the variable _token in your view
 类似资料:
  • 问题内容: 我在CSRF令牌方面遇到问题。当我提交表单时,正在生成一个新的表单,但是我想我正在生成两个不同的令牌,这有点困惑。还有一个名为的令牌,因此我在开发人员工具中看到了两个不同的cookie(XSRF- TOKEN和_csrf),发布后它们没有变化。 我想要做的是为每个帖子请求生成一个新令牌,并检查它是否有效。我知道为了安全起见应该这样做,但是我坚持了下来。 漫长的一天,我是Express和

  • 问题内容: 我正在使用Scala Play!2.6框架,但这可能不是问题。我正在使用他们的Javascript路由- 似乎可以正常工作,但出现了问题。我有一个带有CSRF令牌的表单,在渲染时会产生这种情况: 这大概是我的AJAX: 但是,当我发布此消息时,我从服务器返回了未经授权的响应,并且IntelliJ中的控制台告诉我CSRF检查失败。如何在请求中传递CSRF令牌? 问题答案: 好的,经过几个

  • 问题内容: 我想在Laravel 5应用程序的所有视图中都可以访问一些默认数据。 我尝试搜索它,但仅找到Laravel 4的结果。我在这里阅读了文档“使用所有视图共享数据” ,但我不知道该怎么做。以下代码应放在哪里? 谢谢你的帮助。 问题答案: 这个目标可以通过不同的方法来实现, 1.使用BaseController 我喜欢设置的方式,我制作了一个扩展Laravel自己的类,并在那里设置了各种全局

  • 今天早些时候,我问了一个关于使用ZenDesk API进行ajax调用的问题。 我可以在命令提示符下成功运行以下命令,并在ZenDesk中创建一个票证(是api令牌字符串): 我现在试图理解的是如何将其转换为ajax调用。这是我下面的文档。 我目前正在做的事情如下: 以下是我已经看过的一些答案和文档,但我仍然很困惑: (最佳之一):https://auth0.com/blog/using-json

  • 问题内容: 我正在寻找一种简单的方法,可以一次从一个超级视图中删除所有子视图,而不是一个一个地删除它们。 我缺少什么? 更新 我的应用有一个main 。我必须添加其他不同的视图作为子视图,以便提供一种导航。 因此,当单击按钮“打开”特定页面时,我需要删除所有子视图并添加新的子视图。 更新2-可行的解决方案(OS X) 我猜苹果已经解决了。 现在,它比以往更容易了,只需致电: 问题答案: 编辑:(感

  • 问题内容: 我想在Linux上将所有文件作为单个参数传递,但是我不能这样做。 这工作 每个命令都传递一个参数,但是我希望所有命令都包含一个参数。 问题答案: 这是做到这一点的一种方法 或使用反引号 正如评论中指出的那样,这不适用于包含空格的文件名。在这种情况下,您可以使用 假设有两个名为“ 0 foo”和“ 1 bar”的文件,那么eval的结果将是所需的命令,文件名用双引号引起来: 如果文件名中