Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Unrestricted php file upload fix (#681)
- Loading branch information
1 parent
c9d0a63
commit cdc913d
Showing
7 changed files
with
176 additions
and
8 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,40 @@ | ||
<?php | ||
|
||
namespace Crater\Http\Requests; | ||
|
||
use Crater\Rules\Base64Mime; | ||
use Illuminate\Foundation\Http\FormRequest; | ||
|
||
class AvatarRequest extends FormRequest | ||
{ | ||
/** | ||
* Determine if the user is authorized to make this request. | ||
* | ||
* @return bool | ||
*/ | ||
public function authorize() | ||
{ | ||
return true; | ||
} | ||
|
||
/** | ||
* Get the validation rules that apply to the request. | ||
* | ||
* @return array | ||
*/ | ||
public function rules() | ||
{ | ||
return [ | ||
'admin_avatar' => [ | ||
'nullable', | ||
'file', | ||
'mimes:gif,jpg,png', | ||
'max:20000' | ||
], | ||
'avatar' => [ | ||
'nullable', | ||
new Base64Mime(['gif', 'jpg', 'png']) | ||
] | ||
]; | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,34 @@ | ||
<?php | ||
|
||
namespace Crater\Http\Requests; | ||
|
||
use Crater\Rules\Base64Mime; | ||
use Illuminate\Foundation\Http\FormRequest; | ||
|
||
class CompanyLogoRequest extends FormRequest | ||
{ | ||
/** | ||
* Determine if the user is authorized to make this request. | ||
* | ||
* @return bool | ||
*/ | ||
public function authorize() | ||
{ | ||
return true; | ||
} | ||
|
||
/** | ||
* Get the validation rules that apply to the request. | ||
* | ||
* @return array | ||
*/ | ||
public function rules() | ||
{ | ||
return [ | ||
'company_logo' => [ | ||
'nullable', | ||
new Base64Mime(['gif', 'jpg', 'png']) | ||
] | ||
]; | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,85 @@ | ||
<?php | ||
|
||
namespace Crater\Rules; | ||
|
||
use Illuminate\Contracts\Validation\Rule; | ||
|
||
class Base64Mime implements Rule | ||
{ | ||
private $attribute; | ||
private $extensions; | ||
|
||
/** | ||
* Create a new rule instance. | ||
* | ||
* @return void | ||
*/ | ||
public function __construct(array $extensions) | ||
{ | ||
$this->extensions = $extensions; | ||
} | ||
|
||
/** | ||
* Determine if the validation rule passes. | ||
* | ||
* @param string $attribute | ||
* @param mixed $value | ||
* @return bool | ||
*/ | ||
public function passes($attribute, $value) | ||
{ | ||
$this->attribute = $attribute; | ||
|
||
try { | ||
$data = json_decode($value)->data; | ||
} catch (\Exception $e) { | ||
return False; | ||
} | ||
|
||
$pattern = '/^data:\w+\/[\w\+]+;base64,[\w\+\=\/]+$/'; | ||
|
||
if(!preg_match($pattern, $data)) { | ||
return False; | ||
} | ||
|
||
$data = explode(',', $data); | ||
|
||
if(!isset($data[1]) || empty($data[1])) { | ||
return False; | ||
} | ||
|
||
try { | ||
$data = base64_decode($data[1]); | ||
$f = finfo_open(); | ||
$result = finfo_buffer($f, $data, FILEINFO_EXTENSION); | ||
|
||
if($result === '???') | ||
return False; | ||
|
||
if(strpos($result, '/')) { | ||
foreach(explode('/', $result) as $ext) { | ||
if(in_array($ext, $this->extensions)) | ||
return True; | ||
} | ||
} else { | ||
if(in_array($result, $this->extensions)) | ||
return True; | ||
} | ||
} catch (\Exception $e) { | ||
return False; | ||
} | ||
|
||
return False; | ||
|
||
} | ||
|
||
/** | ||
* Get the validation error message. | ||
* | ||
* @return string | ||
*/ | ||
public function message() | ||
{ | ||
return 'The ' . $this->attribute . ' must be a json with file of type: ' . implode(', ', $this->extensions) . ' encoded in base64.'; | ||
} | ||
} |