Может ли кто-нибудь проверить этот код загрузки изображения в Laravel? - PullRequest
0 голосов
/ 03 марта 2020

Я написал этот код для загрузки изображений, но я не знаю, является ли он безопасным или нет. Есть ли какая-либо проблема или уязвимость в этом коде ??

if($request->hasFile('image')){

    $AllowedImages = ['jpeg', 'jpg', 'png'];
    $AllowedImageTypes = ['image/jpeg', 'image/png'];

    $image = $request->image;
    $ImageNameWithExtension = $image->getClientOriginalName();
    $ImageName = pathinfo($ImageNameWithExtension, PATHINFO_FILENAME);
    $ImageExtension = $image->getClientOriginalExtension();
    $ImageType = $image->getMimeType();
    $ImageLocalPath = $image->getPathName();
    $ImageSize = $image->getSize();
    $ImageError = $image->getError();  
    $ImageNewName = sha1(md5($ImageName)).''.sha1(time()).'.'.$ImageExtension;

    if(in_array($ImageType, $AllowedImageTypes) && in_array($ImageExtension, $AllowedImages) && getimagesize($ImageLocalPath) && ($ImageError === 0) && ($ImageSize <= 2000000)){

        if($ImageType == 'image/jpeg' && ( $ImageExtension == 'jpeg' || $ImageExtension == 'jpg')){
            $img = imagecreatefromjpeg($ImageLocalPath);
            imagejpeg( $img, $ImageNewName, 100);
        }
        elseif($ImageType == 'image/png' && $ImageExtension == 'png'){
            $img = imagecreatefrompng($ImageLocalPath);
            imagepng( $img, $ImageNewName, 9);
        }
        imagedestroy($img);
        try
            {
            $StoreImage = $image->storeAs('public/Upload/', $ImageNewName);
            if(!$StoreImage){
                throw new customException('File Upload Failed');
            }
        }
        catch(customException $e){
            session()->flash('File_Error', $e->errorMessage());
            return back();
        }     
    }
    else{
        session()->flash('File_Error', 'Image Validation Error Found');
        return back();
    }
}
else{
    return back();
}

Ответы [ 2 ]

1 голос
/ 03 марта 2020

Рассмотрите этот рефакторинг для вашего кода, он поможет сделать ваш код чище.

public function store(Request $request)
  {
    $record = Model::create( $this->validateRequest() ); // this can insert other data into your database. In the db table, initially set the image related fields to nullable

    $this->storeFile($record); // this will check if the request has a file and update the image related fields accordingly, else it will remain blank as it is nullable by default

    return 'all data is saved';

  }

private function validateRequest(){

       return request()->validate([
            'type' => 'nullable',
            'image'=> request()->hasFile('image') ? 'mimes:jpeg,jpg,png|max:2000' : 'nullable', // 2000 means a maximum of 2MB 
            'other_field_1' => 'required',
            'other_field_2' => 'required',
            'other_field_3' => 'required'

            ]);

    }

private function storeFile($record){

        if( request()->hasFile('image') ){

            $record->update([
                'type' => request()->file->extension(),
                'image' => request()->file->store('uploads/files', 'public') // The file will be hashed by default. public is used as second argument so you can access the uploaded file via your public folder
            ]);
        }

    }

Это проверка файла в запросе, проверка файла и других данных, загрузка файла в папку хранения.

0 голосов
/ 03 марта 2020

Вы можете использовать этот код для загрузки изображения:

В файле запроса:

public function rules()
{
    return [
        'image' => 'required|mimes:jpeg,jpg,png|max:50000'
    ],
}

А в вашем контроллере:

    public function uploadImage(YourRequestClass $request){
        $image = $request->file('image');

        try{
        $order=new Order();
        if (!file_exists('upload/' . $image)) {
                $currentDate = Carbon::now()->toDateString();
                $imageName = $currentDate . '-' . uniqid() . '.' . $image->getClientOriginalExtension();
                if (!file_exists('upload/')) {
                    mkdir('upload/', 0777, true);
                }
                $image->move('upload/', $imageName);
                $order->image = $imageName;
            }
        $order->save();
        return back();
        } catche(\Exception $e){
            Log::error($e);

            return back();
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...