PHP 5.6.9 上的 Laravel 5 TokenMismatchException

Posted

技术标签:

【中文标题】PHP 5.6.9 上的 Laravel 5 TokenMismatchException【英文标题】:Laravel 5 TokenMismatchException on PHP 5.6.9 【发布时间】:2015-08-10 00:46:35 【问题描述】:

php 5.4 上运行 Laravel 5 应用时,发布请求可以正常工作。在 PHP 5.6.9 上运行的同一应用上的发布请求生成:

第 46 行的 TokenMismatchException VerifyCsrfToken.php

这发生在 WAMP 和 IIS 上的每个发布请求上。使用数据库会话和文件会话发生。完全重新安装并尝试了这里提出的所有建议:https://laracasts.com/discuss/channels/general-discussion/keep-getting-tokenmismatchexception-verifycsrftokenphp-on-line-46?page=2。人们正在禁用 Csrf 中间件作为修复,但这不是一个可行的解决方案。任何帮助表示赞赏。

【问题讨论】:

我很想调试 app/Http/Middleware/VerifyCsrfToken.php 并在 return parent::handle($request, $next); 之前执行以下操作:dd([ Input::all() , Session::all() ]) - 测试会话中的 _token 与输入中的 _token 匹配。跨度> 我更改了.env 中的cookie/会话缓存引擎。 CACHE_DRIVER=file SESSION_DRIVER=file 【参考方案1】:

输入<meta name="csrf_token" content=" csrf_token() ">,以便令牌始终可用并将其与您的 AJAX 请求一起使用: 例如:

var csrftoken =  (function() 
var metas = window.document.getElementsByTagName('meta');
for(var i=0 ; i < metas.length ; i++) 
    if ( metas[i].name === "csrf-token") 
        return  metas[i].content;
    
)();

【讨论】:

这可能与 jquery 是单行的 可以,比如$.ajaxSetup( headers: 'X-CSRF-TOKEN': $('meta[name="csrf_token"]').attr('content') );【参考方案2】:

当我意识到这只发生在 IE 和 Chrome 中,而不是 Firefox 中时,它引导我进行了修复。该应用程序正在使用 AddThis 共享按钮,而 javascript 正在向页面添加 iframe。通过向 VerifyCsrfToken 中间件添加 P3P 标头来解决此问题。希望这可以节省我失去的时间。

public function handle($request, Closure $next)
    
        $response = $next($request);

        if (last(explode('\\',get_class($response))) != 'RedirectResponse') 
            $response->header('P3P', 'CP="IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT"');
        

        return $response;
    

【讨论】:

可能只花了几个小时 4 5 :/ :3 它为我节省了很多时间 这是唯一适用于网络上荒谬的“添加 csrf_field”答案的解决方案。非常感谢您的工作解决方案。 终于找到了一个可行的答案!谢谢!我不知道为什么会这样,但它不仅在 Chrome 上有效,在 Firefox 上也有效。【参考方案3】:

只需将 csrf_field() 添加到您的表单块中,它将为您节省大量时间

<form action=" route('signup') " method="post" class="form-signin">
 csrf_field() 
...
</form>

【讨论】:

【参考方案4】:

对于尽管在form 字段中添加 csrf_field() 甚至在head 标签中添加此问题但仍面临此问题的任何人 <meta name="csrf-token" content=" csrf_token() ">

问题在于写入存储,因为没有将 Linux 上的当前用户添加到正确的组中。确保将您当前的用户添加到www-data 组。 写这个命令

sudo chown -R :www-data /path/to/laravel-folder

确保在 laravel 应用程序中也为存储文件夹授予正确的权限。

sudo chmod -R 775 /path/to/laravel-folder/storage

我希望这会有所帮助。

【讨论】:

【参考方案5】:

我遇到了同样的问题,我可以通过在顶部添加以下包来解决它: "Spatie\Permission\PermissionServiceProvider::class,"

【讨论】:

以上是关于PHP 5.6.9 上的 Laravel 5 TokenMismatchException的主要内容,如果未能解决你的问题,请参考以下文章

从 Laravel 5.2 更新到 5.3 后,调用数组上的成员函数 all()

markdown PHP 5.6性能基准与Laravel 5.4上的PHP 7相比

Apache 与 php的环境搭建

Windows下搭建PHP开发环境

PHP 7.0 上的 Laravel 5.4:PDO 异常 - 找不到驱动程序 (MySQL)

php 7.2.19 上的 Laravel Tinker