Какие шаги я могу предпринять для повышения безопасности, позволяя пользователям связывать изображения из внешнего источника? - PullRequest
0 голосов
/ 24 сентября 2018

Я создал свою собственную систему форумов, и одна из особенностей этой системы заключается в том, что пользователи могут связывать изображения в своих сообщениях.Чтобы было понятно, они могут окружить свою ссылку на изображение с помощью BBCode следующим образом:

[img]https://www.example.com/someimg.jpg[/img]

Затем я использую регулярное выражение для форматирования вывода их сообщения, отправленного из базы данных, поворачивая егов HTML:

<img src="https://www.example.com/someimg.jpg" alt="user-img" />

Я думал, что это нормально, пока мне не пришлось создавать систему, позволяющую пользователям загружать свои собственные изображения профиля, за это время я исследовал и провел несколько проверок безопасностичтобы предотвратить отправку вредоносных данных при загрузке изображений (проверьте типы файлов, измените переданное имя изображения перед сохранением, не разрешайте прямой доступ к этим изображениям и т. д.).Я также прочитал этот вопрос , в котором упоминаются некоторые потенциальные проблемы безопасности, связанные с пользовательским HTML, но больше о том, чтобы позволить пользователям напрямую редактировать HTML.

Я знаю множество веб-сайтов, включая переполнение стека, которые позволяютпользователи для вставки изображений в свои посты / комментарии.Что мешает кому-то загрузить подделанное изображение на свой сайт и связать его с другим сайтом?Что я могу сделать, чтобы сделать мой текущий метод более безопасным?

1 Ответ

0 голосов
/ 24 сентября 2018

Как упомянул IdontDownVote, вы можете прокси-запрос запроса изображения через ваш сервер и проверить его на допустимый тип изображения.

Это имеет несколько хороших моментов:

  • Вредоносные изображения не будут
  • Конфиденциальность ваших пользователей защищена, поскольку ваш сервер отправляет запрос стороннему лицу.

Один пример решения для прокси-скрипта, который проверяет действительностьИзображения типов PNG, JPEG, BMP и GIF могут выглядеть следующим образом:

//IMPORTANT: Implement some sort of check that no local files get echoed by accident!

$img = filter_var($_GET["src"], FILTER_SANITIZE_URL); //Only handle true urls
$type = getimagesize($img)[2] ?: false; //Get src type, "wrong" images would have false

switch($type){ //Set correct content-type and output image
    case IMAGETYPE_GIF:
        header("Content-Type: image/gif");
        echo file_get_contents($img);
        break;
    case IMAGETYPE_BMP:
        header("Content-Type: image/bmp");
        echo file_get_contents($img);
        break;
    case IMAGETYPE_JPEG:
        header("Content-Type: image/jpeg");
        echo file_get_contents($img);
        break;
    case IMAGETYPE_PNG:
        header("Content-Type: image/png");
        echo file_get_contents($img);
        break;
    default: //Create fallback image
        $im = imagecreatetruecolor(100, 100); //Create new 100x100 image
        $bg = imagecolorallocate($im, 255, 255, 255); //Set white background
        $textcolor = imagecolorallocate($im, 0, 0, 255); //Set text-color to blue
        imagestring($im, 5, 0, 42, "Invalid IMG", $textcolor); //Draw text to image
        header("Content-Type: image/png");
        imagepng($im); //Output image
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...