我想查看我的请求他们是否有csrf令牌。所以我创建了几个类来检查它。
在我的第一堂课中,我检查了请求并获得了令牌
$this->token
然后我用CSRF类检查请求。问题是,我无法在checkToken()
方法中使用public function handle($request, Closure $next)
{
$lang = SystemSetting::find('System Language');
\App::setLocale($lang->value);
return $next($request);
}
,它表示null,但是当我在__construct中使用var_dump时,它也会为我提供令牌..
为什么这个hapennig?我该如何解决这个问题?我尝试使用checkToken()方法将$ token作为参数传递,但我得到了相同的结果..
答案 0 :(得分:0)
问题不在于变量,而是if()语法只是错误。
你有两个选择,我强烈建议第一个:
if (in_array(current_method(),array('POST,'PUT','PATCH')){
或
if (current_method() == "POST" || current_method() =="PUT" || current_method() == "PATCH") {
答案 1 :(得分:0)
史密斯回答说,你的语法错了。请参阅下面的代码的修改版本。
另外,关于良好编码实践的一点点,你的current_method()
函数不清楚并且可能正在使用合理数量的资源(可能或可能不是)但在这种情况下,最好一次调用这些函数并且将返回值存储在变量
protected function checkToken()
{
$currentMethod = current_method();
if (in_array($currentMethod, ["POST", "PUT", "PATCH"])) {
if (CSRF::verifyToken(@$_POST['token'])) {
$this->checkPrefix();
}
} elseif (in_array($currentMethod, ["GET", "DELETE"])) {
if (CSRF::verifyToken($this->token)) {
$this->checkPrefix();
}
}
}
您也可以使用switch
阻止这些:
protected function checkToken()
{
$currentMethod = current_method();
switch ($currentMethod) {
case "POST":
case "PUT":
case "PATCH":
if (CSRF::verifyToken(@$_POST['token'])) {
$this->checkPrefix();
}
break;
case "GET":
case "DELETE":
if (CSRF::verifyToken($this->token)) {
$this->checkPrefix();
}
break;
default:
// may be something else?
}
}