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

Думаю, большинство пользователей vk.com вставляли в сообщения ссылки на изображения. А контакт, в свою очередь, дабы не утруждать пользователей переходами по ссылкам, сам качает картинку и вставляет в сообщение уже само изображение, а не url.
Вопрос: как уберечься от левых картинок? Вот так сделает сайт запрос по адресу, а ему в ответ DROP TABLE. Как уберечься от подобного?
Задача стоит в следующем: если пользователь ввёл в поле ссылку, стукнуться по ней и проверить, что там Если картинка, вывести ему в его тексте вместо ссылки миниатюру этой картинки (со стороннего сайта), при клике на которую он уже перейдёт к той, что он ввёл. Если по ссылке текст - тут уже другая обработка...
Как сделать это всё максимально безопасно?
  • Вопрос задан
  • 6902 просмотра
Решения вопроса 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.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы