从 5.4 升级后的 Laravel 419 发布请求

Posted

技术标签:

【中文标题】从 5.4 升级后的 Laravel 419 发布请求【英文标题】:Laravel 419 on post requests after upgrade from 5.4 【发布时间】:2019-06-16 12:00:42 【问题描述】:

从 5.4 升级到 5.7,之后每个 ajax 发布请求都是 419:

    message: "", exception: "Symfony\Component\HttpKernel\Exception\HttpException",…
exception: "Symfony\Component\HttpKernel\Exception\HttpException"
file: "pathto/vendor/laravel/framework/src/Illuminate/Foundation/Exceptions/Handler.php"
line: 204
message: ""
trace: [,…, file: "pathto/public_html/app/Exceptions/Handler.php", line: 47, function: "render",…,…]
0: ,…
class: "Illuminate\Foundation\Exceptions\Handler"
file: "pathto/vendor/laravel/framework/src/Illuminate/Foundation/Exceptions/Handler.php"
function: "prepareException"
line: 176
type: "->"

遵循升级说明,特别提到了 Cookie 序列化:

protected static $serialize = true;

清除缓存,检查文件权限是否正常。降到 5.6,然后降到 5.5 laravel 版本,但没有帮助。更改了cookie名称,尝试隐身。甚至试图绕过所有:

protected $except = [
      "*"
    ];

但没有变化。这里到底会出什么问题?

编辑:

Ajax 调用:

                var $_token = $('#token').val();
                var url = '/delete';

                $.ajax(
                    headers: 'X-XSRF-TOKEN': $_token,
                    type: "POST",
                    url: url,
                    data: (data: data), // set up earlier
                    success: function (data) 

                    
                );   

控制器:

public function delete(Request $request)
      
      $id = $request->input('data);
      Post::where('id', $id)->delete();
     

还尝试使用 $('meta[name="csrf-token"]').attr('content')

这给了我:

payload is invalid

id 令牌取自:

    <?php
    $encrypter = app('Illuminate\Encryption\Encrypter');
    $encrypted_token = $encrypter->encrypt(csrf_token());
    ?>
    <input id="token" type="hidden" value="$encrypted_token">

【问题讨论】:

发布你的控制器方法 你也composer dump-autoload @AshleyBrown 每种方法在 5.4 中都能完美运行,但升级后它们并没有,所以我非常怀疑这是在控制器中。是的,我做了 composer dump-autoload,遗憾的是那里也没有帮助。 【参考方案1】:

只需添加

 csrf_field() 

到您的刀片模板

类似

<form method="POST" action="/projects">
   csrf_field() 
    <div class="form-group">

	    <label for="title">Title</label>

	    <input id="title" class="form-control" type="text" name="title" placeholder="Project Title" required  />

		</div>

    <div class="form-group">

        <button type="submit" class="btn btn-primary">

          Create Project

       </button>


     </div>
		
</form>

【讨论】:

我已经将 csrf 令牌传递给调用。也不是表单,而是基于点击。我还尝试使用 csrf_field 并让该值传入 ajax 标头,但这导致“有效负载无效”【参考方案2】:

如果没有您的控制器和实际的 ajax 调用,这很难说……但我遇到了与此 419 错误类似的问题。对我来说有两个原因:

1) 令牌验证失败。要检查,请将其添加到您的 ajax 调用中:

$.ajaxSetup(
  headers: 
    'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
  
);

虽然...你试图排除一切应该允许它通过(假设你在正确的地方有那条线)。

编辑:如果您从 javascript 传递 X-XSRF-TOKEN,请使用 decodeURIComponent() 对其进行解码

2) 您的控制器可能正在尝试渲染视图而没有所需的所有信息。您是否有可能需要将变量发送到 ajax 控制器函数中的视图并且它丢失了?我意识到这在以前有效,但是 5.5 有一些大的变化(包括上面处理 CSRF 的方式)。

3) 只是我遇到的一个一般性错误,但数据传输的方式可能与 5.4 不同。只需检查数据进入控制器的方式是否没有出错。 IE 在返回视图之前从控制器进行转储并查看浏览器报告正在传输的内容

【讨论】:

好的,我明白了!谢谢你的回答。我添加了更多信息来提问。在任何 ajax 调用中都没有直接传递任何东西来查看。和控制器,即使我退出;直接在控制器的第一行我得到了那个错误。 感谢您发布 ajax 调用。我想我可能对您的问题有答案,请参阅上面的编辑。 过几天我可以再试一次,但谢谢!那我试试看再更新!【参考方案3】:

老话题,但我现在才回到它并想通了。

原因是我通过了:旧 Laravel 中的 XSRF-Token 而不是 CSRF-Token,从来没有版本似乎不再与 XSRF 一起使用。切换到 CSRF 并修复了它。

【讨论】:

以上是关于从 5.4 升级后的 Laravel 419 发布请求的主要内容,如果未能解决你的问题,请参考以下文章

从 Laravel 5.3 升级到 Laravel 5.4 并且空字段转换为 NULL

Laravel AJAX Request Post 错误代码:使用 laravel auth 登录时会话 ID 更改后的 419

将 Laravel 5.4 升级到最新版本 (5.7)

升级到 laravel 5.4 后调用未定义的方法

Laravel 5.3 到 5.4 (mPdf - niklasravnsborg/laravel-pdf ) 升级问题

如何将我的 laravel 5.0 项目直接升级到 5.4?