Laravel 页面已过期 419

Posted

技术标签:

【中文标题】Laravel 页面已过期 419【英文标题】:Laravel Page Expired 419 【发布时间】:2020-05-22 03:16:35 【问题描述】:

一些初学者案例:

我有一个来自云端硬盘的上传视频表单,当我从中上传视频时,上传视频需要很多时间。上传完成后,它返回给我一个 419 过期。

所以我假设上传视频时 csrf_token 已经更改,因此 csrf 不匹配并返回 419(?)

我已经做了一些测试,比如:

在受保护的 $execpt 更改 App\Http\Middleware\VerifyCsrfToken 并添加我的帖子链接,过期的不出来但它返回一个新的问题,没有发送帖子数据。

我一直在考虑使用 jquery 每隔 x 秒刷新一次 div csrf_token(),但我认为这会给我带来另一个问题。

这是我的表格

<form method="POST" action="/video/insert" enctype="multipart/form-data">
            csrf_field()
                <div class="form-group">
                    <label for="judul">Judul</label>
                    <input name="judul" type="text" class="form-control" id="judul" placeholder="Input judul">
                </div>
                <div class="form-group">
                    <label for="informasi">Informasi</label>
                    <input name="informasi" type="text" class="form-control" id="informasi" placeholder="Input informasi">
                </div>
                <div class="form-group">
                    <label for="link">Link</label>
                    <input name="link" type="file" class="form-control-file" id="link" placeholder="Input Link">
                </div>
                <div class="form-group" hidden="">
                    <label for="status"></label>
                    <input name="status" type="text" class="form-control" id="status" placeholder="Input status" value="Tidak Aktif">
                </div>
                <div class="form-group" hidden="">
                    <label for="outletstatus"></label>
                    <input name="outletstatus" type="text" class="form-control" id="outletstatus" placeholder="Input outletstatus" value="Tidak Aktif">
                </div>
                <div class="form-group" hidden="">
                    <label for="type"></label>
                    <input name="type" type="text" class="form-control" id="type" placeholder="Input type" value="Server">
                </div>
                <div class="form-group" hidden="">
                    <label for="user_id"></label>
                    <input name="user_id" type="text" class="form-control" id="user_id" placeholder="Input user_id" value="auth()->user()->id">
                </div>
                <div class="modal-footer">
                    <button type="button" class="btn btn-secondary" data-dismiss="modal">Cancel</button>
                    <button type="submit" class="btn btn-primary">Upload</button>
                </div>
            </form>

根据这个问题的Web.php

Route::group(['middleware'=>['auth','checkRole:Admin,Pengguna']],function()
   // Video Controller
    Route::post('/video/insert','VideoController@insert');
);

控制器:

public function insert(Request $request)
    $video = \App\Video::create($request->all());
    function getName($n)  
        $characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'; 
        $randomString = ''; 

        for ($i = 0; $i < $n; $i++)  
            $index = rand(0, strlen($characters) - 1); 
            $randomString .= $characters[$index]; 
         

        return $randomString; 
     

    if($request->type=='Server')
        $videoName = getName(10) . $request->file('link')->getClientOriginalName();
        $request->file('link')->move('videos/',$videoName);
        $video->link = $videoName;     
    
    else
        $video->link = 'https://www.youtube.com/embed/'.$request->link;
    
    $video->type = $request->type;
    $video->save();
    return redirect('video')->with('status','Video berhasil ditambahkan!');

我的问题是:

视频上传后我们是否有机会发送 csrf 令牌?所以csrf没有过期,你们有什么参考或者最好的方法来解决这个问题吗?

谢谢。

【问题讨论】:

更新你的控制器代码 更新先生@MasoodKhan 【参考方案1】:

你有没有在受保护的 $except 变量与协议中尝试通配符

'http://www.example.com/video-uploader/*'

https://laravel.com/docs/5.8/csrf#csrf-excluding-uris

【讨论】:

是的,我已经试过了。它给了我一个没有发送帖子数据的新问题。我对那个通配符也有疑问,这是否会降低我们的安全性? 上传到第三方api就不行【参考方案2】:

在关闭之前检查是否有任何其他表单处于打开状态。

【讨论】:

是的,在这个表单之前有一个表单,我已经删除了表单(之前)并尝试上传,仍然是同样的问题:( upload_max_filesize , post_max_size in php.ini【参考方案3】:

在 config/session.php 中增加会话生命周期

'lifetime' => env('SESSION_LIFETIME', 120),

'expire_on_close' => false,

【讨论】:

同样的问题先生,我将值更改为 1000 更改服务器 PHP 配置中的 post_max 值和超时值。 非常感谢,我的服务器中的配置是问题! 没问题。是超时吗?packet_size? php-fpm 的 max_execution_time 是问题哈哈。我觉得自己很笨【参考方案4】:

除了其他答案之外,另一个可以解决的问题是改变

upload_max_filesize = 70M  post_max_size = 60M  memory_limit = 50M

php.ini 文件中。 并检查网络服务器中的connection_timeout 设置。

【讨论】:

谢谢先生,我也去看看

以上是关于Laravel 页面已过期 419的主要内容,如果未能解决你的问题,请参考以下文章

419 页面使用 laravel sanctum 过期

登录laravel后页面刷新时419页面过期错误

419 页面在 laravel 5.7 中过期

laravel 5.7.15 419 抱歉,您的会话已过期。请刷新并重试

Laravel CSRF - 419 页面因向其他网站的发布请求而过期

Laravel 5.6 上的 419 Ajax 错误 - 已编辑