【问题标题】:TokenMismatchException in VerifyCsrfToken.phpVerifyCsrfToken.php 中的 TokenMismatchException
【发布时间】:2016-12-23 12:25:40
【问题描述】:

我收到了错误

VerifyCsrfToken.php 第 55 行中的 TokenMismatchException

当我尝试向

提交简单的电子邮件表单时
public function postContact(Request $request)
{
    // code
}

但它永远不会进入代码部分。所以我尝试像这样比较 get 方法中的值:

public function getContact(Request $request)
{
    echo $request->session()->token();
    return view('contact');
}

然后我比较了存储在表单内隐藏字段name=_token中的值,它们返回相同的值。

之后我回溯到抛出异常的方法:

/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/VerifyCsrfToken.php

并回应了失败的测试:

public function handle($request, Closure $next)
{
    echo ($this->isReading($request) ? 'true' : 'false') . ' - ' . ($this->shouldPassThrough($request)? 'true' : 'false') . ' - ' . ($this->tokensMatch($request) ? 'true' : 'false');

    if ($this->isReading($request) || $this->shouldPassThrough($request) || $this->tokensMatch($request)) {
        return $this->addCookieToResponse($request, $next($request));
    }

    throw new TokenMismatchException;
}

结果是:

假-假-假

我完全没有想法。

我总是在测试前清除 cookie,我已将所有权限更改为读/写,并在带有令牌的 head 标记内添加了元 name=csrf-token

编辑:

两者

$request->input('_token')

$request->header('X-CSRF-TOKEN')

里面的handle()都是null...怎么来的?

【问题讨论】:

    标签: php laravel csrf


    【解决方案1】:

    在您的表单(视图)文件中。添加这两行。我希望它会起作用。

    <form role="form" method="POST" action="{{ url('your action URL') }}">
    <input type="hidden" name="_token" value="{{ session()->getToken() }}">
    

    【讨论】:

    • 根据您的建议,我发现问题出在表单中的属性 enctype="text/plain" 上! TYVM!
    • 请编辑此答案,或者发布您自己的答案,并附上您解决问题的完整代码。因此遇到相同问题的下一个程序员可以快速解决问题。
    • 编辑我自己的问题,解释我做了什么就足够了吗?
    • 不,您最好发布完整的答案。这样就不会混淆了。
    • 是的,我见过..不要将它添加到您的问题中。请将其发布为答案。
    【解决方案2】:

    从表单标签中删除了enctype="text/plain"。这将向您展示:当一个框架为您提供像 Form::open() 这样的防白痴渲染器时,只需使用它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-24
      • 2015-06-22
      • 2017-07-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多