2015-10-13 140 views
0

在这种情况下我想安全上传pdf, doc, docx, ppt, pptx, xls, xlsx, rar, zip防止任意文件上传尤其是web shell或任何恶意脚本。Laravel 5安全上传文档文件

问题是我如何验证文件,是否安全上传?从样改变MIME类型篡改数据旁路预防,有多个扩展名重命名文件,在文件名中,小写和大写的文件扩展名等使用;和空间

我的控制器代码看起来象

public function fileUpload(){ 
    $ext = ['pdf', 'doc', 'ppt', 'xls', 'docx', 'pptx', 'xlsx', 'rar', 'zip']; 
    $data = Request::all(); 
    $name = $data['file']->getClientOriginalName(); 
    $rules = [ 
     'file' => 'required' 
    ]; 
    $v = Validator::make($data, $rules); 
    if($v->passes()){ 
     // Check safe file validation 
     // should here or something? and how to prevent bypass 
     // arbitrary file upload especially evil script. 
     $data['file']->move(public_path('assets/uploads'), $name); 
     return 'file uploaded'; 
    }else{ 
     return 'file upload failed'; 
    } 

}

回答

0

我会建议看看Laravel中间件的验证。这将减少您的控制器中的代码并允许它们被重用。

我个人更改任何文件上传的名称随机的东西。如果需要,我总是可以将原始文件名保存在系统的某个位置。

我也看看使用htaccess命令,该命令阻止文件从该文件夹执行。

下面

控制器方法:它使用应用\ HTTP \请求\ CreateUploadRequest;

public function store(CreateUploadRequest $request) 
{ 
    $file = Input::file('file'); 
    $destinationPath = 'assets/uploads'; // upload path 
    $name = $file->getClientOriginalName(); // getting original name 
    $fileName = time().rand(11111, 99999) . '.' . $extension; // renaming image 
    $extension = $file->getClientOriginalExtension(); // getting fileextension 
    $file->save($destinationPath.'/'.$fileName); // uploading file to given path 


} 

中间件

<?php namespace App\Http\Requests; 

use App\Http\Requests\Request; 

class CreateUploadRequest extends Request { 

    /** 
    * Get the validation rules that apply to the request. 
    * 
    * @return array 
    */ 
    public function rules() 
    { 
     return [ 
      'file' => 'required_if:update,false|mimes:pdf,doc,ppt,xls,docx,pptx,xlsx,rar,zip|max:1000' 
     ]; 
    } 

} 

我觉得这个想法是从laracast视频拍摄。我会看看我是否能找到它。