2017-11-25 135 views
3

如何在上传过程中验证图像真的是“图像”还是PDF实际上是“PDF文档”?我观察到黑客尝试上传一些带有JPG图片预览的文件,但是当我试图在编辑器中打开这个文件时,我看到了PHP代码! 。如何验证文件是laravel验证中的“真实文件”

我担心的是:

我如何可以验证文件是一个真正的文件?

进出口使用laravel框架,我像默剧验证测试,如下图所示:

$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'); 
    } 

但这种验证总是通过,如果我尝试上传无效的JPEG文件与一些PHP注入代码!

更新: 连接 enter image description here

+0

您可以查看 - > getClientOriginalExtension()原创extenstion –

+0

@bipinpatel,但这种方法只返回已上载 – Shan

+0

文件的扩展名https://stackoverflow.com/questions/6484307 /如何检查,如果上传文件是一个图像,没有MIME类型 – GoatHater

回答

0

如果你想验证它是一个图像,添加了 '形象' 的准则对待你$rules阵列无效的JPEG文件:

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

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

+0

我也试过你的解决方案。但是这证明“无效文件”是有效的。 – Shan

0

最后,我决定使用方法手动检查文件 - file_ge t_contents()。我不知道这是否是最佳解决方案。等待建议&建议:

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; 
}