VerifyCsrfToken.php中的TokenMismatchException第67行
我知道这是一个已知的错误,像Laravel中的forms。 但是我在Laravel 5.2中遇到了基本身份validation问题。
我使用Laravel创build了auth。
php artisan make:auth
现在我有我的服务器和我的本地代码相同的副本。 在我的本地我没有任何问题。 然而,在我的服务器上,当我尝试注册一个用户时,我收到错误说TokenMismatchException in VerifyCsrfToken.php Line 67
我的本地和服务器环境都是同步的,但我一直在注册时发生错误。 任何帮助我如何解决这个问题?
我假设你添加了$this->middleware('auth');
在你的控制器的构造函数里面来validation工作。 如果您正在使用{!! Form::someElement !!}
,请在您的login/registry单中添加以下内容{!! Form::someElement !!}
{!! Form::someElement !!}
:
{!! csrf_field() !!}
或者,如果您在表单中使用input标签,只需在<form>
标签之后添加:
<input type="hidden" name="_token" value="{{ csrf_token() }}">
干杯。
我有一个类似的问题,这是一个简单的修复。
在您的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() }}
在你的表格标签内。
你需要在你的HTML文档部分有这样的代码行,你可以在默认的情况下这样做,它不会造成任何伤害:
<meta name="csrf-token" content="{{ csrf_token() }}" />
在你的表单中,你需要添加这个隐藏的input字段:
<input type="hidden" name="_token" value="{{ csrf_token() }}">
那就是它,为我工作。
如果没有任何工作,你可以去App / Http / Middleware / VerifyCsrfToken.php文件,并添加您的路由到受保护的$ excpt删除CSRF安全检查。
例如,如果我想删除所有路由的CSRF保护。
protected $except = [ '/*' ];
PS虽然是一个包含CSRF保护的良好实践。
我正要开始拔出我的头发!
请在session.phpconfiguration文件中检查您的会话cookie域。 有一个域选项必须与您的环境相匹配,最好使用您的.env文件进行configuration以进行开发。
'domain' => env('COOKIE_DOMAIN', 'some-sensible-default.com'),
我也面临同样的问题,并在以后解决。 首先执行工匠指令:
PHP的工匠caching:清除
之后重新启动项目。 希望它会有所帮助。
有很多可能会导致这个问题。 让我提一个。 你有没有机会改变你的session.phpconfiguration文件? 可能是你已经从空值更改为您的网站名称或session.php其他任何东西的价值
'domain' => null,
在这个文件中错误的configuration会导致这个问题。
我正在使用在laravel 5.4上运行的应用程序面临同样的问题
php artisan session:table php artisan make:auth php artisan migrate
..然后下面的命令为我工作:)
chmod 777 storage/framework/sessions/
如果您将SESSION_DOMAIN(in .env)设置为与HOST_NAME不同,则还有另外一种可能性
快乐的编码
你的表单方法是后。 因此,打开Middleware / VerifyCsrfToken .php文件,findisReading()方法并在数组中添加“POST”方法。
我也得到这个错误,但是我解决了这个问题。 如果您使用php artisan serve
在{!! Form::open() !!}
{{ csrf_field() }}
下添加此代码{{ csrf_field() }}
{!! Form::open() !!}
{!! Form::open() !!}
- PHP的工匠caching:清除
- 清除caching和Cookie浏览器
- 使用私人浏览器(Mozilla)/隐身窗口(Chrome)
- 打开你的表格/页面,然后再提交家伙
我希望这是解决你的问题。
转到app/provides
。
然后,在RouteServiceProvider.php
文件中,必须在protected function mapWebRoutes(Router $router)
删除'middleware' => 'web'
确保
{!! csrf_field() !!}
在刀片语法中添加到您的表单中。
或者以简单的forms语法
<input type="hidden" name="_token" value="{{ csrf_token() }}">
与此一起,确保在session.php(在configuration文件夹中),以下设置正确。
'domain' => env('SESSION_DOMAIN', 'sample-project.com'),
或更新.env文件中的相同,
SESSION_DOMAIN=sample-project.com
就我而言{!! csrf_field()!!}被正确添加,但是SESSION_DOMAINconfiguration不正确。 在我的.env文件中用正确的值改变它之后,它就起作用了。
在session.php中更改会话驱动程序到我的文件被设置为数组。
如果'www-data'用户对该文件夹没有访问/写入权限,也可能发生:'laravel-project-folder'/ storage / framework / sessions /
下面为我工作。
<input type = "hidden" name = "_token" value = "<?php echo csrf_token(); ?>">
你有没有检查你的隐藏input字段的生成令牌?
如果它为null,那么你的令牌不会被csrf_token函数返回。你必须编写你的路由来呈现laravel提供的中间件组中的表单,如下所示:
Route::group(['middleware' => 'web'], function () { Route::get('/', function () { return view('welcome'); });
这里根路由包含我的注册页面,需要csrf令牌。 这个标记由kernel.php中'web'中间件内的laravel 5.2.7pipe理。
不要忘记插入{! csrf_field()!!}里面的forms..
我有同样的问题,但我解决了纠正我的表单打开如下所示:
{!!Form::open(['url'=>route('auth.login-post'),'class'=>'form-horizontal'])!!}
如果这不能解决你的问题,你能告诉我你是如何打开表格的吗?
你应该试试这个。
将{{csrf_field()}}添加到表单打开标记之后,就像这样。
<form method="POST" action="/your/{{ $action_id }}"> {{ csrf_field() }}
你是否将这个post重新定向? 我有这个问题,我能够通过返回相同的视图,而不是使用Redirect :: back()来解决它。
使用这个返回视图() – > with(),而不是Redirect :: back()。
对我而言,我必须使用安全的https而不是http。
尝试更改config/session.php
的会话生存期,如下所示:
'lifetime' => 120,
'lifetime' => 360,
在这里,我设置了一生到360,希望这个帮助。
默认情况下,如果浏览器具有HTTPS连接,会话cookie将只发送回服务器。 您可以在.env文件中closures它(不鼓励生产)
SESSION_SECURE_COOKIE=false
或者你可以在config / session.php中closures它
'secure' => false,
上传大文件(video)时出现此错误。 表单工作正常,没有不匹配的错误,但只要有人附加一个大的video文件,它会抛出这个令牌错误。 调整最大允许的文件大小和增加处理时间为我解决了这个问题。 不知道为什么Laravel在这种情况下抛出这个错误,但这里有一个更多的潜在的解决scheme。
这里有一个StackOverflow的答案,更详细地介绍如何解决大file upload问题。
PHP更改最大上传文件大小
在我的情况下,当重启服务器后尝试login时,我遇到了一个问题,但是我在表单中有csrf字段,并且没有刷新页面,或者在caching中存在错误。
这是我的解决scheme。 我把这段代码放在\ 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,然后将用户redirect回页面(以重新加载标题和字段中的csrf标记)。 它可能无法正常工作,但它为我的问题。
尝试PHP手工caching:清除或手动删除服务器的存储caching。
如果你检查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_token()
在里面使用了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.'); }
当我初次尝试Laravel 5.2时遇到了同样的问题,于是我了解了{{!! csrf_field() !!}}
{{!! csrf_field() !!}}
被添加到表单中,并解决它。 但后来我了解了表单助手,这照顾了CSRF保护,并没有给出任何错误。 虽然Form Helpers在Laravel 5.2之后并不合法,但您仍然可以在LaravelCollective中使用它们。
你可以通过删除行来解决。 去app \ http \ kernel.php,在这里你可以看到这行\ App \ Http \ Middleware \ VerifyCsrfToken :: class,这对我有效。
在打开标记之后放置此代码:
<input type="hidden" name="_token" value="{{ csrf_token() }}">
我的问题是php.ini中的post_max_size值较小。