嗨为什么我的csrf标记值为空?当我不使用令牌时我没有TokenMismatchException !!!!我该如何解决?
我深入挖掘并发现会话未在SessionServiceProvider中注册。是否需要启用此功能才能默认工作?由于我是Laravel的初学者,我不确定如何遵循上面的建议。如何确保我的路线被添加到“网络”组下?
<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>
答案 0 :(得分:24)
确保您的路线已应用网络轻度软件。
几乎任何你想要会话,csrf保护,加密的cookie,会话错误等的路线......你将需要&#39; web&#39;中间件组应用。
检查路由组的routes.php文件,如下所示:
Route::group(['middleware' => 'web'], function () {
//
});
更新:自5.2.27起RouteServiceProvider
现在将routes.php
中的所有路由放入已应用web
中间件的路由组中。
答案 1 :(得分:4)
在版本5.2中:您将Route移动到:
Route::group(['middleware' => ['web']], function () {
//Your route here
});
有两种方式在表单中使用令牌(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(); ?>">
答案 2 :(得分:3)
使用
{!! csrf_token() !!}
而不是
{{ csrf_token() }}
答案 3 :(得分:3)
确保会话路径可写。如果没有,laravel将null(无会话令牌)与$ _POST ['_ token']值进行比较,并抛出不匹配错误,尽管有其真正的原因。
答案 4 :(得分:2)
将您的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”的错误告诉我非常讨厌吗?
答案 5 :(得分:1)
我认为这是一个非常深刻的问题,因为可能有很多原因。 对我来说,我正在从Laravel 5.1升级到5.2。我也在使用数据库来存储我的会话。 它给了我这个错误但是当我检查了laravel错误日志(/ storage / logs)时,我发现Laravel 5.2期望会话表具有user_id,ip_address和user_agent字段。我没有。当我添加这些字段时,它们的工作方式与升级前相同。 所以,我的建议是检查错误日志!
答案 6 :(得分:1)
这个答案适用于所有已经使用{{ csrf_field() }}
的人
在<form>
文件中的view.blade.php
标记之后,还运行php artisan key:generate
命令,但仍然出现令牌不匹配错误。这些是我为一个仍在开发中的项目解决TokenMismatchException错误的步骤。
从laravel项目中的以下两个文件夹中删除缓存文件:
删除缓存文件后,清除浏览器缓存。
答案 7 :(得分:0)
也许你可以使用它:(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>
答案 8 :(得分:0)
我可以确认这个问题,csrf_token()和csrf_field()都会在Laravel 5.2中生成空标记字段。根据文档,两种方法仍然可以工作,但他们似乎没有这样做。我的安装非常新鲜,因此文档不正确或存在错误。
答案 9 :(得分:0)
我有同样的问题。我没有找到如何解决核心问题,但我认为这是一个不错的解决方案:
Laravel 5.x: Redirect CSRF Errors to Previous Page
因此,请将TokenMismatchException
redirect
用户转到上一页,并显示错误消息
为了做到这一点override
VerifyCsrfToken.($request, Closure $next)
方法
打开App\Http\Middleware\VerifyCsrfToken.php
并获得基类(Illuminate\Foundation\Http\Middleware\VerifyCsrfToken
)并复制App\Http\Middleware\VerifyCsrfToken.php
内的句柄方法并更改引发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令牌在您的网站上超时的软件包。
包装创建者迈克想要有一种安全的方法,让那些花时间填写表格的用户通过幕后的ajax调用来保持令牌清醒。
答案 10 :(得分:0)
你可以使用它:
<form method="POST" action="/addUser" >
{!! csrf_field() !!}
...
</form>
答案 11 :(得分:0)
要验证此表单上的安全性,必须转到Laravel上的文件路径:config / auth.php。在该文件中,您应找到(或创建)行'no_csrf' => array(),
此行用于添加无法验证安全性的路由。在此安排中,您必须添加表单的路径,例如:
'No_csrf' => array('/form'),
答案 12 :(得分:0)
我有同样的问题。通过删除所有文件到会话文件夹解决它。 sessions文件夹的路径是:yourApplication / storage / framework / sessions /
答案 13 :(得分:0)
就我而言,_token正在生成但无法正常工作。我得到419错误代码。但它在特定领域内运作。所以我删除了
env。文件
app_url=
然后开始工作。否则,您必须在此处设置域并运行config:cache
答案 14 :(得分:-1)
我的建议是在您的视图中使用FormHelper
和Form::open()
。 Fomr和HTML帮助程序已从版本5.0中的laravels核心中删除,但您可以按照these说明再次安装它们。
无论如何,你的观点中有一个拼写错误。正确的字段名称为_token
,而不是_Token
。也许这就是问题