8

嗨为什么我的 csrf 令牌值为 null ?当我不使用令牌时,我没有 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>
4

16 回答 16

25

确保您的路由应用了网络恶意软件。

几乎任何您需要会话、csrf 保护、加密 cookie、会话错误等的路由……您都需要应用“网络”中间件组。

检查您的 routes.php 文件中的路由组,如下所示:

Route::group(['middleware' => 'web'], function () {
    //
});

更新:从 5.2.27 开始,RouteServiceProvider现在将您的所有路由放入为您应用中间件routes.php的路由组中。web

于 2015-12-28T03:35:38.277 回答
5

在 5.2 版中:您将 Route 移至:

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(); ?>">
于 2016-02-25T11:12:48.627 回答
3

利用

{!! csrf_token() !!} 

代替

{{ csrf_token() }}
于 2016-01-17T00:27:47.743 回答
3

确保会话路径是可写的。如果不是,laravel 将 null(无会话令牌)与$_POST['_token']value 进行比较,并抛出不匹配错误,尽管有真正的原因。

于 2016-05-23T00:48:51.770 回答
3

以防万一有人仍然遇到这个问题,

config/session.php中,我的会话基本上没有工作(尽管它们在一段时间内看起来还不错)

确保“”变量设置为

为我解决了所有问题,因为实际上我的问题没有其他问题。

希望它可以帮助某人。

于 2016-08-16T07:32:41.957 回答
2

将中间件文件夹中的 VerifyCsrfToken.php 编辑为此

<?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”的错误非常烦人吗?

于 2016-07-04T02:56:56.140 回答
1

我认为这是一个非常深刻的问题,因为可能有很多原因。对我来说,我是从 Laravel 5.1 升级到 5.2。我还使用数据库来存储我的会话。它给了我这个错误,但是当我检查 laravel 错误日志(/storage/logs)时,我发现 Laravel 5.2 期望会话表具有 user_id、ip_address 和 user_agent 字段。我的没有。当我添加这些字段时,它的工作方式与升级前相同。所以,我的建议是检查错误日志!

于 2016-03-07T15:01:39.297 回答
1

此答案适用于所有已在文件中的标签{{ csrf_field() }} 之后使用过并且也运行过该命令但仍然收到 Token Mismatch 错误的人。这些是我为解决仍在开发中的项目之一的 TokenMismatchException 错误而采取的步骤。<form>view.blade.phpphp artisan key:generate

从 laravel 项目中的以下两个文件夹中删除缓存文件:

  1. 存储/框架/会话/
  2. 存储/框架/视图/

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

于 2016-07-08T13:34:54.287 回答
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 重定向到上一页的行。还添加 import 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 调用保持令牌处于唤醒状态,从而让那些花时间填写表单的用户的生活更轻松。

于 2016-01-23T20:18:33.863 回答
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>
于 2015-12-27T07:43:01.517 回答
0

我有同样的问题。通过将所有文件删除到会话文件夹中来解决它。session文件夹的路径是:yourApplication/storage/framework/sessions/

于 2016-06-01T19:10:00.203 回答
0

我可以确认这个问题,csrf_token() 和 csrf_field() 在 Laravel 5.2 中都会产生空的令牌字段。根据文档,这两种方法都应该仍然有效,但它们似乎没有这样做。我的安装是全新的,因此文档不正确或存在错误。

于 2015-12-28T03:15:18.613 回答
0

你可以用这个:

<form method="POST" action="/addUser" >
 {!! csrf_field() !!}
...
</form>
于 2016-01-26T09:18:55.357 回答
0

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

环境。文件

app_url= 

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

于 2020-09-01T05:39:11.280 回答
0

要不验证此表单的安全性,必须转到文件路径:Laravel 上的 config/auth.php。在该文件中,您应该找到(或创建它)这一行'no_csrf' => array(),这一行是添加无法验证安全性的路由。在这种安排中,您必须将路径添加到表单中,例如:

'No_csrf' => array('/form'),
于 2016-05-18T21:49:18.680 回答
-1

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

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

于 2016-05-09T09:44:15.090 回答