是'图像'规则安全吗?

时间:2015-02-21 13:16:34

标签: php validation laravel

所以我试图为我的网站创建上传个人资料图片......我想知道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类型验证它。

它足够安全吗?欢迎任何问题!

2 个答案:

答案 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)

回答你的问题我们不能说任何有担保的事情。

但是 Laravel只会根据您指定的格式验证图片。还提到here

如果您认为这是基本验证,那么您应该使用像this这样的第三方软件包,它可以按宽高比验证图像(只有真正的图像可以使用它)