[英]Is 'image' rule secure enough?
因此,我试图为我的网站创建一个上传个人资料图片,而且我想知道image
规则在Laravel中是否足够安全。
考虑以下代码:
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!';
}
非常简单,我要让您关注的是rules
数组中的image
规则。
Laravel似乎通过其MIME类型来验证图像。 众所周知,可以从客户端进行编辑,然后使用篡改数据或Burp代理之类的内容将其发送到服务器。
您说如何知道它通过其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类型对其进行验证。
这样足够安全吗? 任何问题都欢迎!
不,这是不安全的。 至少您不能确定它是否是真实图像,因为可以操纵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'];
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.