jQuery CSRF不起作用-ForbiddenError:无效的CSRF令牌

时间:2019-03-27 11:50:25

标签: jquery express csrf

我有一些jQuery代码,当我在页面上的模式中单击按钮时会触发该jQuery代码,以从页面中删除某些元素。这段代码在过去是有效的,但是一旦我添加了中间件来向GETHEAD方法添加尾随斜杠,或者基于创建csrf的代码不相关,我就开始注意到问题。令牌和DELETE触发器。我收到的错误是ForbiddenError: invalid csrf token

在触发模式的同一页面上,我有以下内容,因此我知道CSRF令牌存在,并且在我发布POST时,记录也会更新:

<form action="/app/blog/edit/2jVE2rGEmp/?_csrf=1POIam29-Psd35YjTfDzAKHnGDLxw8zaccccacURY" method="post" enctype="multipart/form-data" id="blogEditSubmission">
                <input type="hidden" name="_csrf" value="1POIam29-Psd35YjTfDzAKHnGDLaccccacURY">

但是,正如我提到的,DELETE方法存在于使用jQuery触发的模式中,并具有自己的csrf生成器。

//Call DELETE route for tag
    $('#delete-tag-button').click(function(){

        var CSRF_HEADER = 'X-CSRF-Token';

        var setCSRFToken = function (securityToken) {
          jQuery.ajaxPrefilter(function (options, _, xhr) {
            if (!xhr.crossDomain) {
              xhr.setRequestHeader(CSRF_HEADER, securityToken);
            }
          });
        };

        setCSRFToken($('input[name="_csrf"]').attr('value'));

        var pathArray = window.location.pathname.split('/');
        var blogId = pathArray[4];

        var tagField = $('#tag-id').val();

        $.ajax({
            method: 'DELETE',
            url: '/app/blog/' + blogId + '/tag/' + tagField + '/',
            success: function(){
                window.location.replace('/app/blog/edit/' + blogId);
            },
            error: function(error){
                console.log(error);
            }
        });

    });

在后端,我运行了以下中间件,这些中间件过去从来都不是问题:

//Set CSRF for Form Tokens
app.use(csrf());
app.use(function(req, res, next){
    res.locals._csrf = req.csrfToken();
    next();
});

是否有一些与众不同的地方可能是我的jQuery调用不再起作用的原因。如果是“ GET”或“ HEAD”,这是否可能与从中间件将“ /”重定向到URL路径的末尾有关?

0 个答案:

没有答案