在使用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,这将解决问题。但是,当我尝试执行此操作时,遇到了相同的错误,我尝试了多种操作,例如在请求之前重新生成令牌,但目前看来它什么都没用。
如果有人可以帮助我解决这个问题,我将非常高兴。
答案 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
};
这对我有用。