Как проверить изображение на корректность и отсутствие вредоносного кода?

Думаю, большинство пользователей vk.com вставляли в сообщения ссылки на изображения. А контакт, в свою очередь, дабы не утруждать пользователей переходами по ссылкам, сам качает картинку и вставляет в сообщение уже само изображение, а не url.
Вопрос: как уберечься от левых картинок? Вот так сделает сайт запрос по адресу, а ему в ответ DROP TABLE. Как уберечься от подобного?
Задача стоит в следующем: если пользователь ввёл в поле ссылку, стукнуться по ней и проверить, что там Если картинка, вывести ему в его тексте вместо ссылки миниатюру этой картинки (со стороннего сайта), при клике на которую он уже перейдёт к той, что он ввёл. Если по ссылке текст - тут уже другая обработка...
Как сделать это всё максимально безопасно?
  • Вопрос задан
  • 6992 просмотра
Решения вопроса 1
miraage
@miraage
Старый прогер
Моя любимая функция для подобных проверок.
php.net/manual/ru/function.getimagesize.php

Вернуло false? Досвидос!

function getimgsize($url)
{
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 6.2; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1667.0 Safari/537.36');
    $img = curl_exec($ch);
    curl_close($ch);

    $tmpfile = tempnam('/tmp', '__myprefix__');
    file_put_contents($tmpfile, $img);

    $info = @getimagesize($tmpfile);
    unlink($tmpfile);

    return $info;
}

var_dump(getimgsize('http://toster.ru/images/no_avatar.png'));
var_dump(getimgsize('http://toster.ru/images/no_avatar.png2'));
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 4
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Чтбы понять, что там, всё равно придётся сначала скачать файл. А дальше можно его как угодно анализировать, например через finfo в php. Можно сначала получить заголовок через запрос HEAD, убедиться, что файл существует и определить его объём.
И уж конечно никакие полученные от клиента данные не должны писаться в базу без контроля. Как минимум mysqli::bind.
Ответ написан
Комментировать
@art_gur
Быть может попробовать получить размеры картинки? Ведь скрипт вряд ли их отправит Вам.
К примеру, Если размеры, Высота = 0 и Ширина 0, то не качаем. Если больше нуля, Высота 30 и ширина 30 продолжаем.
Ответ написан
alekciy
@alekciy
Вёбных дел мастер
Вот так сделает сайт запрос по адресу, а ему в ответ DROP TABLE.

У вас в голове видимо большой сумбур. Зайду издалека. Каким образом обращение к URL выполнить запрос в базу?

Задача стоит в следующем: если пользователь ввёл в поле ссылку, стукнуться по ней и проверить, что там Если картинка,

curl + Content-Type + Mime.
curl, fileinfo.
Кроме того в GD есть крайне полезная функция.
Ответ написан
demimurych
@demimurych
Скачать картинку, и сделать ее преобразование к формату нужному сайту. Преобразование делать инструментами которые позволяют полностью контролировать параметры выходного файла. Например imagemagick.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы