【问题标题】:CSRF token mismatch for ajax post using nodejs express使用nodejs express的ajax帖子的CSRF令牌不匹配
【发布时间】:2017-08-16 10:37:45
【问题描述】:

环境:express 4、jquery、krakenjs、font-awesome

在控制器/产品/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 post到后端的。

$('.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 调用时,我是否需要在 ajax 帖子中插入 csrf 令牌或消除令牌验证。

【问题讨论】:

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


    【解决方案1】:

    Krakenjs 使用 Lusca 用于 crsf 保护。

    Lusca 将 crsf _token 存储在 req.locals 中。

    另外,将视图中的 crsf 标记设置为隐藏/数据属性,并将其作为 ajax 帖子的一部分。

    【讨论】:

    • 将csrf存储在meta标签中,然后在ajax调用之前添加一个标题X-CSRF-Token是一个好习惯吗?即&lt;meta name="csrf-token" content="xxx"&gt;
    • 不这么认为。发布另一个关于它的问题。如果答案解决了您的问题,请将其标记为已接受
    【解决方案2】:

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

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

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

    为了获得最佳实践,

    1. 将此变量设为前端全局变量。所以我们可以很容易地检索它。
    2. 在 ajax 标头中设置 csrf 令牌,但不在表单数据中。并将此行为注册到 jquery 事件。见http://erlend.oftedal.no/blog/?blogid=118

    【讨论】:

      【解决方案3】:

      您需要为您的 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.
              }
            });
      

      【讨论】:

      • X-XSRF-TOKEN 不正确,应该是 X-CSRF-TOKEN
      猜你喜欢
      • 1970-01-01
      • 2018-08-02
      • 2015-12-20
      • 2014-11-04
      • 1970-01-01
      • 2017-01-25
      • 2014-03-22
      • 2019-01-15
      • 1970-01-01
      相关资源
      最近更新 更多