【问题标题】:Does nodejs have a form helper similar to that of ruby's to generate CSRF tokens?nodejs 是否有类似于 ruby​​ 的表单助手来生成 CSRF 令牌?
【发布时间】:2012-07-29 07:09:29
【问题描述】:

在 ruby​​ 中,可以执行<%= form_tag(:action => '/submit') do %> ... <% end %> 之类的操作来获取包含 CSRF 令牌的表单。

node中是否有现成的功能,它是如何实现的?

【问题讨论】:

    标签: node.js csrf csrf-protection


    【解决方案1】:

    您可以将 caolan-forms plugin 用于 node.js。之后安装express-csrf plugin

    然后你可以合并这两个,比如:

    // initializing express
    var express = require('express'),
    
    // initializing express-csrf   
    csrf = require('express-csrf');
    
    app = express.createServer();
    
    app.dynamicHelpers({
        csrf: csrf.token
    });
    
    var forms = require('forms'),
        fields = forms.fields,
        validators = forms.validators;
    
    var reg_form = forms.create({
        username: fields.string({required: true, id: csrf, name: csrf}),
    });
    
    // finally render the form
    reg_form.toHTML();
    

    它会产生:

    <div class="field required">
       <label for="id_username">Username</label>
       <input type="text" name="[csrf-value]" id="[csrf-value]" value="test" />
    </div>
    

    注意: caolan-forms 的作者写道:

    你会注意到你必须提供你自己的表单标签和提交按钮,这样更灵活;)

    编辑

    由于 express-csrf 已被贬低,请改用 connect bundle 并遵循 this 简单示例。最终,您将能够将其与 caolan-forms 集成,例如:

    var reg_form = forms.create({
         '_csrf':fields.hidden({value: 'req.session._csrf'}),
          ...
    })
    

    【讨论】:

    • 这会自动要求表单发布上的 csrf 令牌吗?它是自动处理 ajax 还是我需要读取令牌并添加到值中?
    • 无论是否提交 AJAX 表单,都会提交 csfr 令牌。任何跨站点伪造尝试都将被发送错误,并带有 403 状态代码作为响应。查看functionality of csfr.check()
    • This module is deprecated Please use the csrf middleware bundled with Connect instead.github.com/hanssonlarsson/express-csrf
    • 我没用过connect,但听起来很有希望。使用npm install connect 安装并在github.com/senchalabs/connect 检查其Git 存储库
    • 是的,至少 caolan-forms 插件有点类似于 rails forms helper。遵循 DRY 原则,同时保持模块化,并且视图以这种方式非常漂亮。如有必要,使用 CSS 装饰“字段”类的包装 div。 :)
    猜你喜欢
    • 2016-07-11
    • 2010-12-20
    • 1970-01-01
    • 2014-01-21
    • 2016-11-08
    • 2011-09-11
    • 1970-01-01
    • 2012-01-29
    相关资源
    最近更新 更多