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 用户扔到带有错误消息的上一页。
为了做到overrideVerifyCsrfToken.($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 字段。我的没有。当我添加这些字段时,它的工作方式与升级前相同。 所以,我的建议是检查错误日志!

我的建议是在您看来使用 FormHelperForm::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 项目中的以下两个文件夹中删除缓存文件:

  1. storage/framework/sessions/
  2. storage/framework/views/

删除缓存文件后,清除浏览器缓存。

万一还有人遇到这个问题,

config/session.php 中,我的会话基本上没有工作(即使它们暂时看起来还不错)

确保“domain”变量设置为 null!

为我解决了所有问题 none 实际上是我的问题的其他问题。

希望对大家有所帮助。

在我的例子中,_token 正在生成但不起作用。我收到 419 错误代码。但它在特定领域工作。所以我删除了

env. file

app_url= 

然后开始工作。否则你必须在这里设置域名 运行 config:cache