从5.4升级后,Laravel 419可以发布请求

时间:2019-01-22 23:41:57

标签: laravel

从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}}">

3 个答案:

答案 0 :(得分:1)

在没有您的控制器和实际的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在返回视图之前先从控制器进行转储,然后查看浏览器报告正在传输的内容

答案 1 :(得分: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>

答案 2 :(得分:0)

旧话题,但是我现在回到原来的话题,并弄清楚了。

原因是我正在传递:较旧的Laravel中的XSRF-Token而不是CSRF-Token,从不版本似乎不再适用于XSRF。切换到CSRF并对其进行了修复。