Laravel 5.2:csrf令牌不起作用

时间:2015-12-26 20:45:48

标签: php laravel laravel-5 laravel-5.2

嗨为什么我的csrf标记值为空?当我不使用令牌时我没有TokenMismatchException !!!!我该如何解决?

Look at the image Please

我深入挖掘并发现会话未在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>

15 个答案:

答案 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项目中的以下两个文件夹中删除缓存文件:

  1. 存储/框架/会话/
  2. 存储/框架/视图/
  3. 删除缓存文件后,清除浏览器缓存。

答案 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)

我的建议是在您的视图中使用FormHelperForm::open()。 Fomr和HTML帮助程序已从版本5.0中的laravels核心中删除,但您可以按照these说明再次安装它们。

无论如何,你的观点中有一个拼写错误。正确的字段名称为_token,而不是_Token。也许这就是问题