使用nodejs表达的ajax帖子的CSRF令牌不匹配

时间:2015-04-10 04:49:39

标签: jquery ajax node.js csrf kraken.js

环境:表达4,jquery,krakenjs,font-awesome

在controllers / products / index.js

module.exports = function (router) {
    router.post('/add',function(req,res){
        // do something
    });
};

在html文件中,用户点击图标并将产品添加到购物车

{?products}
    {#products}
        <ul id="{.id}">
            <li class="add"><i class="fa fa-plus"></i></li>
        </ul>
    {/products}
{/products}

对于每个产品,以下脚本都是将ajax发布到后端。

$('.add').click(function(e){
       var _id = this.parentElement.id;
       $.ajax({
           url: "/products/add",
           type: 'POST',
           contentType: 'application/json',
           dataType: 'json',
           data: JSON.stringify({
             id: _id
           })
       });
 });

然后,服务器响应500(内部服务器错误)并指出“错误:CSRF令牌不匹配”。我是否需要在ajax帖子中插入csrf令牌,或者在没有表单提交的情况下进行ajax调用时消除令牌验证。

3 个答案:

答案 0 :(得分:3)

Krakenjs使用Lusca 保护crsf。

Lusca将crsf _token存储在req.locals

此外,将视图中的crsf标记设置为hidden / data-attribute,并将其作为ajax帖子的一部分包含在内。

答案 1 :(得分:2)

你应该在你的ajax帖子中插入一个csrf令牌。

如果您使用快速csrf中间件,那么req中会有一个变量,如req.csrfToken()(使用csurf中间件)或其他东西。

在输出html中打印此变量并使用javascript来获取它。

为了最佳实践,

  1. 使此变量成为前端全局变量。所以我们可以轻松找回它。
  2. 在ajax标头中设置csrf标记,但不在表单数据中设置。并将此行为注册到jquery事件。见http://erlend.oftedal.no/blog/?blogid=118

答案 2 :(得分:0)

您需要在POST请求中添加带有正确TOKEN的标题“X-XSRF-TOKEN”。

这对我有用:

$.ajaxSetup({
        beforeSend: function (xhr) {
          xhr.setRequestHeader("X-XSRF-TOKEN", $cookies.get("XSRF-TOKEN"));
        }
      });

$.ajax({
        type: "POST",
        url: "/api/endpoint",
        data: formData, 
        cache: false,
        contentType: false,
        processData: false,
        success: function(data)
        {
          alert(data); // show response from the upload response.
        }
      });