所以我试图为我的网站创建上传个人资料图片......我想知道Laravel中image
规则是否足够安全。
请考虑以下代码:
input = [
'profile_picture' => Input::file('profile_picture'),
];
$rules = ['profile_picture' => 'required|image'];
$validator = Validator::make($input, $rules);
if ($validator->fails()) {
return 'It\'s not an image!';
}
非常简单,我希望您关注的是image
数组中的rules
规则。
似乎Laravel通过MIME类型验证图像。我们知道,可以从客户端编辑它,然后使用Tamper Data或Burp Proxy之类的东西发送到服务器。
你说你怎么知道它通过MIME类型验证图像?好吧......看看下面的代码,这是Laravel用于验证的Validator.php
类。它包含我认为的每一条规则。具体而言,这是validateImage
函数,即image
规则。
验证/ validateImage():
/**
* Validate the MIME type of a file is an image MIME type.
*
* @param string $attribute
* @param mixed $value
* @return bool
*/
protected function validateImage($attribute, $value)
{
return $this->validateMimes($attribute, $value, array('jpeg', 'png', 'gif', 'bmp'));
}
正如Doc-block所说,它通过MIME类型验证它。
它足够安全吗?欢迎任何问题!
答案 0 :(得分:2)
不,它不安全。至少你不能确定它是否是真实的图像,因为可以操纵MIME类型。通常有用的是使用getimagesize()
,如果文件不是图像,将返回false
。因此,您可以使用此规则扩展验证器:
Validator::extend('real_image', function($attribute, $value, $parameters){
if($value instanceof Symfony\Component\HttpFoundation\File\UploadedFile){
if(getimagesize($value->getRealPath() !== false){
return true;
}
}
return false;
}
并将其添加到验证规则中:
$rules = ['profile_picture' => 'required|image|real_image'];
答案 1 :(得分:0)