Я думаю о предмете просто: все загруженные изображения являются злыми.
И не только потому, что они могут содержать вредоносные коды, но особенно из-за мета-тегов.Я знаю о сканерах, которые просматривают в Интернете, чтобы найти некоторые защищенные изображения, используя свои скрытые метатеги, а затем поиграть с их авторскими правами.Возможно, немного параноидально, но поскольку загруженные пользователем изображения не контролируют проблемы с авторским правом, я принимаю это всерьез во внимание.
Чтобы избавиться от этих проблем, я систематически конвертирую все загруженные изображения в png с помощью gd.Это имеет много преимуществ: изображение очищено от возможных вредоносных кодов и метатегов, у меня есть только один формат для всех загруженных изображений, я могу настроить размер изображения в соответствии со своим стандартом, и ... Я сразу знаюЕсли изображение является действительным или нет! Если изображение не может быть открыто для преобразования (используя imagecreatefromstring , который не заботится о формате изображения), то я считаю изображение недействительным.
Простая реализация может выглядеть так:
function imageUploaded($source, $target)
{
// check for image size (see @DaveRandom's comment)
$size = getimagesize($source);
if ($size === false) {
throw new Exception("{$source}: Invalid image.");
}
if ($size[0] > 2000 || $size[1] > 2000) {
throw new Exception("{$source}: Too large.");
}
// loads it and convert it to png
$sourceImg = @imagecreatefromstring(@file_get_contents($source));
if ($sourceImg === false) {
throw new Exception("{$source}: Invalid image.");
}
$width = imagesx($sourceImg);
$height = imagesy($sourceImg);
$targetImg = imagecreatetruecolor($width, $height);
imagecopy($targetImg, $sourceImg, 0, 0, 0, 0, $width, $height);
imagedestroy($sourceImg);
imagepng($targetImg, $target);
imagedestroy($targetImg);
}
Чтобы проверить это:
header('Content-type: image/png');
imageUploaded('http://www.dogsdata.com/wp-content/uploads/2012/03/Companion-Yellow-dog.jpg', 'php://output');
Это не совсем ответ на ваш вопрос, так как это тот же тип взлома, чемпринятый ответ, но я дам вам свои причины, по крайней мере: -)