Laravel 5.2 : csrf 令牌不起作用
Laravel 5.2 : csrf token doesn't work
您好为什么我的 csrf 令牌值为空?当我不使用令牌时,我没有 TokenMismatchException!!!!我该如何解决?
我深入挖掘,发现会话未在 SessionServiceProvider 中注册。默认情况下是否需要启用某些功能才能使其正常工作?由于我是 Laravel 初学者,我不确定如何遵循上述建议。如何确保我的路线被添加到 "web" 组下?
<form method="post" action="<?php echo url('/form'); ?>">
<input type="hidden" name="_Token" value="{{ csrf_token() }}">
<input type="text" name="Title" placeholder="Title"><br>
<textarea rows="10" name="Content" placeholder="Content"></textarea><br>
<input type="submit" value="Send">
</form>
也许你可以使用这个:(src = https://laravel.com/docs/5.2/routing)
<form action="/foo/bar" method="POST">
<input type="hidden" name="_method" value="PUT">
<input type="hidden" name="_token" value="{{ csrf_token() }}">
</form>
我可以确认这个问题,csrf_token() 和 csrf_field() 都在 Laravel 5.2 中生成空标记字段。根据文档,这两种方法应该仍然有效,但它们似乎并没有这样做。我的安装是全新的,因此文档不正确或存在错误。
确保您的路由应用了 web milddleware。
几乎所有您需要会话、csrf 保护、加密 cookie、会话错误等的路由...您都需要应用 'web' 中间件组。
像这样检查您的 routes.php 文件中的路由组:
Route::group(['middleware' => 'web'], function () {
//
});
更新: 从 5.2.27 开始 RouteServiceProvider
现在将您的所有路线放在 routes.php
中的路线组中 web
为您申请的中间件
使用
{!! csrf_token() !!}
而不是
{{ csrf_token() }}
我也有同样的问题。我没有找到解决核心问题的方法,但我认为这是一个不错的解决方法:
Laravel 5.x: Redirect CSRF Errors to Previous Page
因此,而是将 TokenMismatchException
redirect
用户扔到带有错误消息的上一页。
为了做到override
VerifyCsrfToken.($request, Closure $next)
方法。
打开 App\Http\Middleware\VerifyCsrfToken.php
并到达基础 class(Illuminate\Foundation\Http\Middleware\VerifyCsrfToken
) 并在 App\Http\Middleware\VerifyCsrfToken.php
中复制 handle 方法并更改抛出 TokenMismatchException
的行以重定向到上一页。还要添加导入 use Closure;
。所以在所有更改之后,App\Http\Middleware\VerifyCsrfToken.php
将看起来像:
<?php
namespace App\Http\Middleware;
use Closure;
use Illuminate\Foundation\Http\Middleware\VerifyCsrfToken as BaseVerifier;
/**
* Class VerifyCsrfToken
* @package App\Http\Middleware
*/
class VerifyCsrfToken extends BaseVerifier
{
/**
* The URIs that should be excluded from CSRF verification.
*
* @var array
*/
protected $except = [
//
];
public function handle($request, Closure $next)
{
if (
$this->isReading($request) ||
$this->runningUnitTests() ||
$this->shouldPassThrough($request) ||
$this->tokensMatch($request)
) {
return $this->addCookieToResponse($request, $next($request));
}
//throw new TokenMismatchException;
return Redirect::back()->withError('Sorry, we could not verify your request. Please try again.');
}
}
解决方案 2 是使用 Caffeine For Laravel。
Caffeine For Laravel 是一个旨在防止用户 CSRF 令牌在您的网站上填写表格时超时的软件包。
包创建者 Mike 希望有一种安全的方式,通过幕后 ajax 调用使令牌保持清醒,从而使花时间填写表格的用户的生活更轻松。
你可以只使用这个:
<form method="POST" action="/addUser" >
{!! csrf_field() !!}
...
</form>
在版本 5.2 中:您将路线移动到:
Route::group(['middleware' => ['web']], function () {
//Your route here
});
有两种形式使用Token的方式(https://laravel.com/docs/master/routing#csrf-protection):
// Vanilla PHP
<?php echo csrf_field(); ?>
// Blade Template Syntax
{{ csrf_field() }}
或者
<input type="hidden" name="_token" value="<?php echo csrf_token(); ?>">
我认为这是一个很深层次的问题,原因可能有很多。
对我来说,我是从 Laravel 5.1 升级到 5.2。我还使用数据库来存储我的会话。
它给了我这个错误,但是当我检查 laravel 错误日志 (/storage/logs) 时,我发现 Laravel 5.2 期望会话 table 有 user_id,ip_address 和 user_agent 字段。我的没有。当我添加这些字段时,它的工作方式与升级前相同。
所以,我的建议是检查错误日志!
我的建议是在您看来使用 FormHelper
和 Form::open()
。 Fomr 和 HTML 助手已从 5.0 版的 Laravels 核心中删除,但您可以按照 these 说明重新安装它们。
总之,您的观点有误。正确的字段名称是 _token
而不是 _Token
。也许这就是问题所在
要不验证此表单的安全性,必须转到文件路径:config/auth。php Laravel。在该文件中,您应该找到(或创建它)行 'no_csrf' => array(),
此行用于添加无法验证安全性的路由。在这种安排中,您必须将路径添加到您的表单中,例如:
'No_csrf' => array('/form'),
确保会话路径可写。如果不是,laravel 将 null(无会话令牌)与 $_POST['_token']
值进行比较,并抛出不匹配错误,尽管有真正的原因。
我有同样的问题。通过将所有文件删除到会话文件夹中来解决它。
会话文件夹的路径是:yourApplication/storage/framework/sessions/
将你的 VerifyCsrfToken.php 从 Middleware 文件夹编辑到这个
<?php namespace App\Http\Middleware;
use Closure;
use Illuminate\Foundation\Http\Middleware\VerifyCsrfToken as BaseVerifier;
class VerifyCsrfToken extends BaseVerifier {
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
$response = $next($request);
$response->headers->set('Access-Control-Allow-Origin' , '*');
$response->headers->set('Access-Control-Allow-Methods', 'POST, GET, OPTIONS, PUT, DELETE');
$response->headers->set('Access-Control-Allow-Headers', 'Content-Type, Accept, Authorization, X-Requested-With, Application');
return $response;
}
}
我和你有同样的问题,我在 Laravel 5.2,我的表单上也有一个标记字段,但仍然抛出 "TokenMismatch" 的错误,非常烦人吧?
此答案适用于所有已经使用过的人 {{ csrf_field() }}
在他们的 view.blade.php
文件中的 <form>
标记之后,还有 运行 php artisan key:generate
命令,但仍然出现令牌不匹配错误。这些是我为我的一个仍在开发中的项目解决 TokenMismatchException 错误所采取的步骤。
从您的 laravel 项目中的以下两个文件夹中删除缓存文件:
- storage/framework/sessions/
- storage/framework/views/
删除缓存文件后,清除浏览器缓存。
万一还有人遇到这个问题,
在 config/session.php 中,我的会话基本上没有工作(即使它们暂时看起来还不错)
确保“domain”变量设置为 null!
为我解决了所有问题 none 实际上是我的问题的其他问题。
希望对大家有所帮助。
在我的例子中,_token 正在生成但不起作用。我收到 419 错误代码。但它在特定领域工作。所以我删除了
env. file
app_url=
然后开始工作。否则你必须在这里设置域名 运行 config:cache
您好为什么我的 csrf 令牌值为空?当我不使用令牌时,我没有 TokenMismatchException!!!!我该如何解决?
我深入挖掘,发现会话未在 SessionServiceProvider 中注册。默认情况下是否需要启用某些功能才能使其正常工作?由于我是 Laravel 初学者,我不确定如何遵循上述建议。如何确保我的路线被添加到 "web" 组下?
<form method="post" action="<?php echo url('/form'); ?>">
<input type="hidden" name="_Token" value="{{ csrf_token() }}">
<input type="text" name="Title" placeholder="Title"><br>
<textarea rows="10" name="Content" placeholder="Content"></textarea><br>
<input type="submit" value="Send">
</form>
也许你可以使用这个:(src = https://laravel.com/docs/5.2/routing)
<form action="/foo/bar" method="POST">
<input type="hidden" name="_method" value="PUT">
<input type="hidden" name="_token" value="{{ csrf_token() }}">
</form>
我可以确认这个问题,csrf_token() 和 csrf_field() 都在 Laravel 5.2 中生成空标记字段。根据文档,这两种方法应该仍然有效,但它们似乎并没有这样做。我的安装是全新的,因此文档不正确或存在错误。
确保您的路由应用了 web milddleware。
几乎所有您需要会话、csrf 保护、加密 cookie、会话错误等的路由...您都需要应用 'web' 中间件组。
像这样检查您的 routes.php 文件中的路由组:
Route::group(['middleware' => 'web'], function () {
//
});
更新: 从 5.2.27 开始 RouteServiceProvider
现在将您的所有路线放在 routes.php
中的路线组中 web
为您申请的中间件
使用
{!! csrf_token() !!}
而不是
{{ csrf_token() }}
我也有同样的问题。我没有找到解决核心问题的方法,但我认为这是一个不错的解决方法:
Laravel 5.x: Redirect CSRF Errors to Previous Page
因此,而是将 TokenMismatchException
redirect
用户扔到带有错误消息的上一页。
为了做到override
VerifyCsrfToken.($request, Closure $next)
方法。
打开 App\Http\Middleware\VerifyCsrfToken.php
并到达基础 class(Illuminate\Foundation\Http\Middleware\VerifyCsrfToken
) 并在 App\Http\Middleware\VerifyCsrfToken.php
中复制 handle 方法并更改抛出 TokenMismatchException
的行以重定向到上一页。还要添加导入 use Closure;
。所以在所有更改之后,App\Http\Middleware\VerifyCsrfToken.php
将看起来像:
<?php
namespace App\Http\Middleware;
use Closure;
use Illuminate\Foundation\Http\Middleware\VerifyCsrfToken as BaseVerifier;
/**
* Class VerifyCsrfToken
* @package App\Http\Middleware
*/
class VerifyCsrfToken extends BaseVerifier
{
/**
* The URIs that should be excluded from CSRF verification.
*
* @var array
*/
protected $except = [
//
];
public function handle($request, Closure $next)
{
if (
$this->isReading($request) ||
$this->runningUnitTests() ||
$this->shouldPassThrough($request) ||
$this->tokensMatch($request)
) {
return $this->addCookieToResponse($request, $next($request));
}
//throw new TokenMismatchException;
return Redirect::back()->withError('Sorry, we could not verify your request. Please try again.');
}
}
解决方案 2 是使用 Caffeine For Laravel。
Caffeine For Laravel 是一个旨在防止用户 CSRF 令牌在您的网站上填写表格时超时的软件包。
包创建者 Mike 希望有一种安全的方式,通过幕后 ajax 调用使令牌保持清醒,从而使花时间填写表格的用户的生活更轻松。
你可以只使用这个:
<form method="POST" action="/addUser" >
{!! csrf_field() !!}
...
</form>
在版本 5.2 中:您将路线移动到:
Route::group(['middleware' => ['web']], function () {
//Your route here
});
有两种形式使用Token的方式(https://laravel.com/docs/master/routing#csrf-protection):
// Vanilla PHP
<?php echo csrf_field(); ?>
// Blade Template Syntax
{{ csrf_field() }}
或者
<input type="hidden" name="_token" value="<?php echo csrf_token(); ?>">
我认为这是一个很深层次的问题,原因可能有很多。 对我来说,我是从 Laravel 5.1 升级到 5.2。我还使用数据库来存储我的会话。 它给了我这个错误,但是当我检查 laravel 错误日志 (/storage/logs) 时,我发现 Laravel 5.2 期望会话 table 有 user_id,ip_address 和 user_agent 字段。我的没有。当我添加这些字段时,它的工作方式与升级前相同。 所以,我的建议是检查错误日志!
我的建议是在您看来使用 FormHelper
和 Form::open()
。 Fomr 和 HTML 助手已从 5.0 版的 Laravels 核心中删除,但您可以按照 these 说明重新安装它们。
总之,您的观点有误。正确的字段名称是 _token
而不是 _Token
。也许这就是问题所在
要不验证此表单的安全性,必须转到文件路径:config/auth。php Laravel。在该文件中,您应该找到(或创建它)行 'no_csrf' => array(),
此行用于添加无法验证安全性的路由。在这种安排中,您必须将路径添加到您的表单中,例如:
'No_csrf' => array('/form'),
确保会话路径可写。如果不是,laravel 将 null(无会话令牌)与 $_POST['_token']
值进行比较,并抛出不匹配错误,尽管有真正的原因。
我有同样的问题。通过将所有文件删除到会话文件夹中来解决它。 会话文件夹的路径是:yourApplication/storage/framework/sessions/
将你的 VerifyCsrfToken.php 从 Middleware 文件夹编辑到这个
<?php namespace App\Http\Middleware;
use Closure;
use Illuminate\Foundation\Http\Middleware\VerifyCsrfToken as BaseVerifier;
class VerifyCsrfToken extends BaseVerifier {
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
$response = $next($request);
$response->headers->set('Access-Control-Allow-Origin' , '*');
$response->headers->set('Access-Control-Allow-Methods', 'POST, GET, OPTIONS, PUT, DELETE');
$response->headers->set('Access-Control-Allow-Headers', 'Content-Type, Accept, Authorization, X-Requested-With, Application');
return $response;
}
}
我和你有同样的问题,我在 Laravel 5.2,我的表单上也有一个标记字段,但仍然抛出 "TokenMismatch" 的错误,非常烦人吧?
此答案适用于所有已经使用过的人 {{ csrf_field() }}
在他们的 view.blade.php
文件中的 <form>
标记之后,还有 运行 php artisan key:generate
命令,但仍然出现令牌不匹配错误。这些是我为我的一个仍在开发中的项目解决 TokenMismatchException 错误所采取的步骤。
从您的 laravel 项目中的以下两个文件夹中删除缓存文件:
- storage/framework/sessions/
- storage/framework/views/
删除缓存文件后,清除浏览器缓存。
万一还有人遇到这个问题,
在 config/session.php 中,我的会话基本上没有工作(即使它们暂时看起来还不错)
确保“domain”变量设置为 null!
为我解决了所有问题 none 实际上是我的问题的其他问题。
希望对大家有所帮助。
在我的例子中,_token 正在生成但不起作用。我收到 419 错误代码。但它在特定领域工作。所以我删除了
env. file
app_url=
然后开始工作。否则你必须在这里设置域名 运行 config:cache