我找到了问题的原因。XSRF-TOKEN cookie 值有时会在末尾附加一个流氓字符:'%3D' - 有时末尾有两个。不知道他们是如何到达那里的,但是当他们在场时,验证失败。
如果您对 cookie 值进行 base64_decode,您会得到一个 json 字符串,其中包含流氓字符:'7' 附加到末尾,因此 Laravel 的解密方法失败。
我最终不得不编写自己的 CSRF 验证函数:
$payload = base64_decode($request->header('X-XSRF-TOKEN'));
//Remove any rogue chars from the end of the json
for($i=0; $i<strlen($payload); $i++){
$lastChar = substr($payload, -1);
if($lastChar != '}'){
$payload = substr($payload, 0, -1);
} else {
break;
}
}
//Needs to be base64 encoded when passed to decrypt
$payload = base64_encode($payload);
$headerToken = decrypt($payload);
$cookieToken = $request->cookie('XSRF-TOKEN');
//Compare tokens
if($headerToken == $cookieToken){
return true;
} else {
return false;
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
19830 次 |
最近记录: |