使用Ajax发布

时间:2018-08-24 08:46:37

标签: php jquery ajax csrf slim

在使用Ajax发布请求时,我一直在努力使CSRF正常工作。 我确实有多个使用相同CSRF令牌的请求。但是问题在于它已经在第一个被执行的程序上失败了。 (加载页面时只有1个触发器)

代码的简要概述:

Ajax调用:

var settings = {
                "async": true,
                "crossDomain": true,
                "url": "http://localhost:3000/locations",
                "method": "POST",
                "headers": {
                    "{{ nameKey }}": "{{ name }}",
                    "{{ valueKey }}": "{{ value }}",
                    "Cache-Control": "no-cache"
                }
            }

            $.ajax(settings).done(function (Data) {

中间件:

$container['csrf'] = function ($c) {
    $csrf = new \Slim\Csrf\Guard;
    $csrf->setPersistentTokenMode(true);
    return $csrf;
};
$app->add($container->get('csrf'));

一段时间以来,我一直在寻找如何解决此问题的方法。我几乎看到的所有地方都告诉他们将令牌持久模式设置为true,这将解决问题。但是,当我尝试执行此操作时,遇到了相同的错误,我尝试了多种操作,例如在请求之前重新生成令牌,但目前看来它什么都没用。

如果有人可以帮助我解决这个问题,我将非常高兴。

1 个答案:

答案 0 :(得分:0)

我发现将CSRF值发布为标头不起作用。 (邮递员在那里填写数据时给了我这个主意) 相反,我不得不去创建一个表单并像这样

附加CSRF
                    let form = new FormData();
                    form.append("csrf_name", csrfName);
                    form.append("csrf_value", csrfValue);
                    var settings = {
                      "async": true,
                      "crossDomain": true,
                      "url": "http://localhost:3000/update,
                      "method": "POST",
                      "headers": {
                        "Cache-Control": "no-cache"
                      },
                      "processData": false,
                      "contentType": false,
                      "mimeType": "multipart/form-data",
                      "data": form
                    };

这对我有用。