【问题标题】:How to verify a file is a "real file" in laravel validation如何验证文件是laravel验证中的“真实文件”
【发布时间】:2018-05-09 05:52:50
【问题描述】:

在上传过程中如何验证图像真的是“图像”或 PDF 真的是“PDF 文档”?我观察到黑客尝试上传一些带有 jpg 扩展名的文件,该文件有图片预览,但是当我试图在编辑器中打开这个文件时,我看到了 php 代码! .

我担心的是:

如何验证文件是否为真实文件?

我使用的是 laravel 框架,我用图像 mimes 验证进行了测试,如下所示:

$inputs = array('image'=>$request->file('file'));
$rules = array(
          'image' => 'mimes:jpeg,jpg,png,gif|required|max:10000'
        );

$validator = Validator::make($inputs, $rules);
    if ($validator->fails()){
        die('validation failed');
    }else{
        die('validation Passed');
    }

但是,如果我尝试使用一些 php 注入代码上传无效的 jpeg 文件,此验证总是会通过!!

更新: 附加了无效的 jpeg 文件

【问题讨论】:

  • 您可以检查 ->getClientOriginalExtension() 以获取原始扩展名
  • @bipinpatel,但是这个方法只返回已经上传的文件的扩展名
  • @GoatHater 我检查了 getImageSize() 并得到了结果数组: , Array ( [0] => 317 [1] => 40 [2] => 1 [3] => width ="317" height="40" [bits] => 6 [channels] => 3 [mime] => image/gif )。这似乎对“无效文件”有效

标签: php laravel validation


【解决方案1】:

如果您想验证它是否为图像,请将“图像”规则添加到您的 $rules 数组中:

$rules = array(
      'image' => 'image|mimes:jpeg,jpg,png,gif|required|max:10000'
);

https://laravel.com/docs/master/validation#rule-image

【讨论】:

  • 我也试过你的解决方案。但这会验证“无效文件”是否有效。
【解决方案2】:

最后,我决定使用以下方法手动检查文件 - 文件获取内容()。我不知道这是否是最佳解决方案。等待建议和建议:

public function validateFileContents($file,$needlesArray=null){
    if(empty($needlesArray)){
        $needlesArray = ['<?php','eval','base','gzuncomp'];
    }
    foreach($needlesArray as $needle){
        if( strpos(file_get_contents($file),$needle) !== false) {
            return false;
            break;
        }
    }
    return true;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-30
    • 2014-04-18
    • 2018-01-10
    • 2017-11-20
    • 1970-01-01
    相关资源
    最近更新 更多