【问题标题】:TokenMismatchException in VerifyCsrfToken.php Line 67VerifyCsrfToken.php 第 67 行中的 TokenMismatchException
【发布时间】:2016-04-24 07:31:08
【问题描述】:

我知道这是 Laravel 中的表单之类的已知错误。但是我在 Laravel 5.2 中遇到了基本身份验证的问题。

我使用 Laravel 创建了身份验证;

php artisan make:auth

现在我的服务器和本地都有相同的代码副本。在我当地,我没有任何问题。但是在我的服务器上,当我尝试注册用户时,我收到错误消息 TokenMismatchException in VerifyCsrfToken.php Line 67

我的本​​地环境和服务器环境都是同步的,但我在注册时不断收到错误消息。有关如何解决此问题的任何帮助?

【问题讨论】:

  • 尝试运行 php artisan key:generate 除了检查登录、注销、创建视图中的 crsf 字段:
  • 您可以通过隐藏或删除该行来解决。转到app\http\kernal.php,这里可以看到\App\Http\Middleware\VerifyCsrfToken::class,这一行
  • 请参阅文档中的从 CSRF 保护中排除 URI 部分:laravel.com/docs/5.1/routing
  • 我认为是写权限问题,在项目根文件夹中尝试此命令,风险自负:sudo chmod -R 777 storage

标签: laravel-5.2


【解决方案1】:

我曾经遇到过这个异常,我是这样解决的:浏览到您的项目目录并从 app\Http\Middleware\ 目录打开 VerifyCsrfToken.php。并在提供的数组中列出导致异常的 URI(路由)。

protected $except = [
   //list your routes here
];

【讨论】:

    【解决方案2】:

    我假设您在控制器的构造函数中添加了$this->middleware('auth'); 以使身份验证正常工作。在您的登录/注册表单中,如果您使用的是{!! Form::someElement !!},请在顶部添加以下行:

    {!! csrf_field() !!}
    

    或者如果您在表单中使用输入标签,只需在<form> 标签之后添加以下行:

    <input type="hidden" name="_token" value="{{ csrf_token() }}">
    

    希望这会有所帮助。

    【讨论】:

    • 是的。就像我说的那样,我使用了 php artisan make:auth。 Laravel 提供的样板登录和注册表格有 {!! csrf_field() !!} 默认添加在其中。检查我网站上的其他表格,所有表格都有 csrf 保护。就像我说它在我的本地工作没有问题,但只要我检查服务器,它就坏了。
    • 登录是否在您的服务器上工作,或者在身份验证方面没有任何工作?您是否还检查了本地和服务器环境的配置?它应该是相同的@GauravMehta
    • 没有登录也不能在服务器上工作。检查本地和服务器上的配置是什么意思?您指的是特定文件还是其他配置?
    • 版本应该相同,你应该在你的服务器上安装所有模块,就像你在本地环境中一样@GauravMehta
    • 是的,因为我一起在两个环境上进行了作曲家更新,所以一切都匹配。
    【解决方案3】:

    这样使用

    <form>
    <input type="hidden" name="_token" value="<?= csrf_token(); ?>" />
    

    【讨论】:

      【解决方案4】:
      output_buffering=4096;
      always_populate_raw_post_data=-1;
      upload_max_filesize=120M;
      

      在 public_html 中创建 user.ini 文件并将以上三个值放入 user.ini 文件中 解决了我的问题

      【讨论】:

        【解决方案5】:

        进入你的 laravel 文件夹 :: App/http/Middleware/VerifyCsrfToken.php

        <?php
        
        namespace App\Http\Middleware;
        
        use Illuminate\Foundation\Http\Middleware\VerifyCsrfToken as BaseVerifier;
        
        class VerifyCsrfToken extends BaseVerifier
        {
            /**
             * The URIs that should be excluded from CSRF verification.
             *
             * @var array
             */
            protected $except = [
                // Pass your URI here. example ::
        
                '/employer/registration'
            ];
        }
        

        它会从 Csrf 验证中排除这个 url。对我有用。

        【讨论】:

          【解决方案6】:
          namespace App\Http\Middleware;
          
          protected $except = ['api/*'];
          

          【讨论】:

          • 虽然这篇纯代码帖子可能会回答这个问题,但请添加解释为什么会这样。
          【解决方案7】:

          将此代码放在&lt;form&gt;&lt;/form&gt; 标签之间:

          <input type="hidden" name="_token" value="{{ csrf_token() }}">
          

          【讨论】:

            【解决方案8】:

            我的应用程序在 laravel 5.4 上运行时遇到了同样的问题

            php artisan session:table
            php artisan make:auth
            php artisan migrate
            

            .. 然后下面的命令对我有用:)

            chmod 777 storage/framework/sessions/
            

            如果您将 SESSION_DOMAIN(在 .env 中)设置为与 HOST_NAME 不同,则可能会出现此问题

            愉快的编码

            【讨论】:

            • 你太棒了。
            • 我的解决方案是将.env文件中的SESSION_DOMAINhttps://example.com更改为example.com
            【解决方案9】:

            我的问题是 php.ini 中的 post_max_size 值太小。

            【讨论】:

              【解决方案10】:

              确定

              {!! csrf_field() !!}
              

              以刀片语法添加到您的表单中。

              或以简单的形式语法

              <input type="hidden" name="_token" value="{{ csrf_token() }}">
              

              除此之外, 确保在 session.php(在 config 文件夹中)中,以下设置正确。

              'domain' => env('SESSION_DOMAIN', 'sample-project.com'),
              

              或在 .env 文件中更新相同的内容,例如,

              SESSION_DOMAIN=sample-project.com
              

              在我的情况下 {!! csrf_field() !!} 已正确添加,但 SESSION_DOMAIN 未正确配置。在我的 .env 文件中用正确的值更改它后,它就起作用了。

              【讨论】:

                【解决方案11】:

                您可以通过删除该行来解决。转到 app\http\kernel.php,在这里你可以看到 \App\Http\Middleware\VerifyCsrfToken::class 行,这对我有用。

                【讨论】:

                • 你不想这样做。这将使您容易受到 CSRF 攻击。我强烈建议不要这样做!
                【解决方案12】:

                转到app/provides

                然后,在文件RouteServiceProvider.php 中,您必须删除protected function mapWebRoutes(Router $router) 中的'middleware' =&gt; 'web'

                【讨论】:

                  【解决方案13】:

                  我一开始在尝试 Laravel 5.2 时遇到了同样的问题,然后我了解到要在表单中添加 {{!! csrf_field() !!}} 并解决了它。但后来我了解了 Form Helpers,它负责 CSRF 保护并且不会给出任何错误。尽管 Laravel 5.2 之后表单助手不再合法可用,但您仍然可以从 LaravelCollective 使用它们。

                  【讨论】:

                    【解决方案14】:

                    如果您检查 Laravel 5.4 中的一些默认表单,您会发现这是如何完成的:

                    <form class="form-horizontal" role="form" method="POST" action="{{ route('password.email') }}">
                      {{ csrf_field() }}
                    
                      <div class="form-group{{ $errors->has('email') ? ' has-error' : '' }}">
                        <label for="email" class="col-md-4 control-label">E-Mail Address</label>
                    
                        <div class="col-md-6">
                          <input id="email" type="email" class="form-control" name="email" value="{{ old('email') }}" required> @if ($errors->has('email'))
                          <span class="help-block">
                                                            <strong>{{ $errors->first('email') }}</strong>
                                                        </span> @endif
                        </div>
                      </div>
                    
                      <div class="form-group">
                        <div class="col-md-6 col-md-offset-4">
                          <button type="submit" class="btn btn-primary">
                                                        Send Password Reset Link
                                                    </button>
                        </div>
                      </div>
                    </form>
                    

                    {{ csrf_field() }}
                    

                    是添加 Laravel 能够理解的自定义隐藏字段的最合适的方式。

                    csrf_filed() 在内部使用csrf_token(),如您所见:

                    if (! function_exists('csrf_field')) {
                        /**
                         * Generate a CSRF token form field.
                         *
                         * @return \Illuminate\Support\HtmlString
                         */
                        function csrf_field()
                        {
                            return new HtmlString('<input type="hidden" name="_token" value="'.csrf_token().'">');
                        }
                    }
                    

                    csrf_field() 方法使用会话来完成这项工作。

                    function csrf_token()
                    {
                        $session = app('session');
                    
                        if (isset($session)) {
                            return $session->token();
                        }
                    
                        throw new RuntimeException('Application session store not set.');
                    }
                    

                    【讨论】:

                      【解决方案15】:

                      下面对我有用。

                      <input type = "hidden" name = "_token" value = "<?php echo csrf_token(); ?>">
                      

                      【讨论】:

                        【解决方案16】:

                        尝试 php artisan cache:clear 或手动从服务器中删除存储缓存。

                        【讨论】:

                          【解决方案17】:

                          在我的情况下,我在重新启动服务器后尝试登录时遇到了问题,但是我在表单中有 csrf 字段并且我没有刷新页面,或者它在缓存中保留了一些错误。

                          这是我的解决方案。我把这段代码放在\App\Http\Middleware\VerifyCsrfToken.php

                          public function handle($request, Closure $next)
                          {
                              try {
                                  return parent::handle($request, $next); // TODO: Change the autogenerated stub
                              } catch(TokenMismatchException $e) {
                                  return redirect()->back();
                              }
                          }
                          

                          它的作用是捕获 TokenMismatchException,然后将用户重定向回页面(在标题和字段中重新加载 csrf 令牌)。 它可能并不总是有效,但它对我的问题有效。

                          【讨论】:

                            【解决方案18】:

                            请遵循一个非常简单的步骤。您只需在 app\http\kernel.php 而不是 app\kernel.php 文件中注释以下行:

                            \App\Http\Middleware\VerifyCsrfToken::class,
                            

                            希望它能解决您的问题,如果它不起作用,请告诉我。

                            【讨论】:

                            • 你不应该这样做,因为它是默认提供的安全性。
                            • 希望你不知道CSRF
                            • 它可以保护您的应用程序免受跨站点请求伪造 (CSRF) 攻击。永远不要评论这一行。
                            【解决方案19】:

                            上传大文件(视频)时出现此错误。表单工作正常,没有不匹配错误,但是一旦有人附加了一个大的视频文件,它就会抛出这个令牌错误。调整最大允许文件大小并增加处理时间为我解决了这个问题。不知道为什么 Laravel 在这种情况下会抛出这个错误,但这里还有一个可能的解决方案。

                            这是一个 StackOverflow 答案,其中详细介绍了如何解决大文件上传问题。

                            PHP change the maximum upload file size

                            【讨论】:

                              【解决方案20】:

                              默认情况下,只有当浏览器具有 HTTPS 连接时,会话 cookie 才会被发送回服务器。您可以在 .env 文件中将其关闭(不鼓励用于生产)

                              SESSION_SECURE_COOKIE=false
                              

                              或者你可以在 config/session.php 中关闭它

                              'secure' => false,
                              

                              【讨论】:

                                【解决方案21】:

                                尝试像这样更改config/session.php 上的会话生命周期:

                                'lifetime' =&gt; 120,'lifetime' =&gt; 360,

                                在这里我将生命周期设置为 360,希望对您有所帮助。

                                【讨论】:

                                  【解决方案22】:

                                  如果“www-data”用户没有访问/写入权限,也会发生 在文件夹上: 'laravel-project-folder'/storage/framework/sessions/

                                  【讨论】:

                                    【解决方案23】:

                                    我也收到此错误,但问题已解决。如果您使用php artisan serve,请在{!! Form::open() !!}下添加此代码{{ csrf_field() }}

                                    1. php artisan 缓存:清除
                                    2. 清除缓存和 cookie 浏览器
                                    3. 使用私人浏览器 (Mozilla)/隐身窗口 (Chrome)
                                    4. 请打开您的表单/页面,然后再次提交

                                    我希望这能解决你的问题。

                                    【讨论】:

                                      【解决方案24】:

                                      对我来说,我不得不使用安全的 https 而不是 http。

                                      【讨论】:

                                        【解决方案25】:

                                        我正要开始拔头发!

                                        请在 session.php 配置中检查您的会话 cookie 域。有一个必须与您的环境相匹配的域选项,并且最好使用 .env 文件进行配置以进行开发。

                                        'domain' => env('COOKIE_DOMAIN', 'some-sensible-default.com'),
                                        

                                        【讨论】:

                                        • 这拯救了我的早晨。默认情况下它设置为 null,但我有一个值可以在我忘记的 .env 文件中设置它。谢谢。
                                        【解决方案26】:

                                        将 session.php 中的会话驱动程序更改为文件,我的设置为数组。

                                        【讨论】:

                                          【解决方案27】:

                                          有很多可能导致这个问题。 让我提一个。 你有没有改变过你的 session.php 配置文件? 可能是您将域的值从 null 更改为您的站点名称或 session.php 中的其他任何内容

                                          'domain' =&gt; null,

                                          此文件中的错误配置会导致此问题。

                                          【讨论】:

                                          • 这是我遇到的问题。
                                          【解决方案28】:

                                          您是否在发布后将其重定向回来?我遇到了这个问题,我能够通过返回相同的视图而不是使用 Redirect::back() 来解决它。

                                          使用这个 return view()->with(),而不是 Redirect::back()。

                                          【讨论】:

                                            【解决方案29】:

                                            我遇到了类似的问题,而且很容易解决。

                                            将此添加到您的 HTML 元标记区域:

                                             <meta name="csrf-token" content="{{ csrf_token() }}">
                                            

                                            然后在您的 JQuery 引用下,添加以下代码:

                                            <script type="text/javascript">
                                                  $.ajaxSetup({
                                                    headers: {
                                                        'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
                                                    }
                                                  });
                                              </script>
                                            

                                            如果您使用的是 HTML 表单提交(不是 AJAX),那么您需要输入:

                                            {{ csrf_field() }} 
                                            

                                            在您的表单标签内。

                                            【讨论】:

                                            • 在哪里可以找到 JQuery 参考?
                                            • 在你上面的回答中,你说在 JQuery 参考下,添加代码 "
                                            • jquery 参考可以如下: 在附近,添加代码::
                                            【解决方案30】:

                                            你应该试试这个。

                                            像这样在表单开始标记之后添加 {{ csrf_field() }}

                                            <form method="POST" action="/your/{{ $action_id }}">
                                            {{ csrf_field() }}    
                                            

                                            【讨论】:

                                              猜你喜欢
                                              • 1970-01-01
                                              • 2016-07-27
                                              • 2016-10-30
                                              • 1970-01-01
                                              • 1970-01-01
                                              • 1970-01-01
                                              • 1970-01-01
                                              • 2016-09-03
                                              • 2017-09-24
                                              相关资源
                                              最近更新 更多