我已经设置了正常的CSRF等等,并且运行良好,但是当我使用whatwg-fetch api(https://github.com/github/fetch)
去使用ajax时现在一切似乎都很好,而且一切都很好。但!然后我按如下所示添加CSRF设置,它始终失败:
所以,我使用了法线,但它失败了,在标题中我得到了消息:Failed CSRF check!
$app->add(new \Slim\Csrf\Guard);
但是我想添加自己的消息等,所以添加了以下内容,但仍然没有通过。
$container['csrf'] = function ($c) {
$guard = new \Slim\Csrf\Guard;
$guard->setFailureCallable(function ($request, $response, $next) {
$request = $request->withAttribute("csrf_status", false);
return $next($request, $response);
});
return $guard;
};
$app->add($container->get('csrf'));
然后在我的课上我用它来检查:
if (false === $req->getAttribute('csrf_status')) {...}else{//all ok}
但是发生的事情总是会失败。
在我的js中,我将令牌详细信息添加到请求中,如:
fetch('/post/url',{
method: 'POST',
headers: {
'X-CSRF-Token': {
'csrf_name':csrf_name,
'csrf_value':csrf_value
}
},
body: new FormData(theForm)
我查看了发布的数据等,并提交了表单数据,包括csrf值等。那么需要csrf数据是通过表单还是标题发送的?
那么如何让ajax功能与Slim CSRF一起使用,我缺少什么?
提前致谢
答案 0 :(得分:1)
我也无法获取将令牌放入体内。我决定扩展该类,以便我可以修改__invoke方法。我添加了一些代码来从头文件中提取csrf。
您的依赖项中的现在使用此类。
CLS d = std::string{"5"}; // pass a temporary std::string constructed from "5" to the constructor of CLS
using namespace std::string_literals;
CLS d = "5"s; // "5"s is a string literal of type std::string (supported from C++14)
扩展类。
$c['csrf'] = function ($c) {
return new \Foo\CSRF\Guard;
};
答案 1 :(得分:0)
fetch api
后,我决定回到可靠的jQuery aJax方法,这似乎已经奏效了。
似乎以下body
并且new FormData()
未被提取:
fetch('/post/url',{
method: 'POST',
body: new FormData(theForm)
因此将其改为
$.ajax({
url : '/url/to/post',
type: "POST",
data: {key:value, kay:value}
一切运作良好。
接下来要研究的问题是,在第一次ajax调用时刷新密钥,除非刷新页面,否则会阻止不再调用,但那是另一天
答案 2 :(得分:0)
在阅读其中一位创作者的博客后,我再次参与其中。所以你可以忽略我以前的答案。
使用这些标题在正文中发送csrf会通过csrf检查。
const data = {
'csrf_name': csrf_name,
'csrf_value': csrf_value,
};
fetch(apiUrl, {
method: 'POST',
credentials: 'include',
body: JSON.stringify(data),
headers: {
'Content-Type': 'application/json, application/x-www-form-urlencoded; charset=utf-8',
},
}).then((response) => {
if (response.ok) {
return response.json();
}
return null;
}).then((json) => {
console.log(json);
}).catch(() => {
});
答案 3 :(得分:0)
使用fetch时,最终帮助我成功使用Slim PHP和CSRF值的是将credentials: 'include'
添加到获取请求中,例如:
const body = JSON.stringify({
csrf_name: csrfName.value,
csrf_value: csrfValue.value
// You can add more data here
});
fetch('/some/request', {
method: 'POST',
body: body,
credentials: 'include',
headers: {
Accept: 'application/json',
'Content-Type': 'application/json'
},
}).then(...)