Что-то может “плохо” произойти через img src?

Я знаю, я знаю, титул довольно дефектен, но я попытаюсь объяснить, что я имею в виду здесь. Так, я прошу, чтобы мои участники показали свои фотографии. Они загружают его где-нибудь, затем вставляют URL их фотографий во вход, и я сохраняю его к своей базе данных (MySQL). Затем фотография замечается на их профилях. Я получаю URL от базы данных и делаю что-то как этот: <img src="<?=$photo;?>" height="123px" width="123px">"> где $photo URL, взятый от MySQL. Действительно ли это полностью безопасно? Кто-то может загрузить, например, .php файл и вредить моему веб-сайту? Я должен проверить, является ли конечный URL .gif, .png, .jpg?
Спасибо.

Править: Да, конечно, я защитил бы свой веб-сайт от нападений на XSS и Внедрений SQL. Но есть ли какой-либо способ вредить моему веб-сайту другим способом?

21
задан good_evening 24 June 2010 в 22:23
поделиться

12 ответов

То, что вы описали, может быть уязвимым для атаки XSS (межсайтовый скриптинг). По сути, гнусный пользователь может внедрить код javascript, который может делать плохие вещи, выполняясь от имени вашего сайта.

Для примера этого вектора атаки посмотрите: http://jarlsberg.appspot.com/part2#2__stored_xss_via_html_attribute

РЕДАКТИРОВАТЬ: Похоже, вы уже защищаете себя от SQL-инъекций и XSS, и вам интересно, есть ли способ внедрить PHP-код на ваш сайт. Я не думаю, что это возможно, поскольку ваш серверный код не будет выполнять эту строку. Вы просто указываете клиентскому браузеру загрузить изображение по URL-адресу.

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

12
ответ дан 29 November 2019 в 20:28
поделиться

Одна вещь, которую вы должны учесть - я могу дать вам ссылку на мое изображение "XUltra highres" размером около 200 мегов. Я думаю, это может нарушить загрузку вашего сайта (в зависимости от дизайна). Так что, помимо "скриптовых атак", разрешение пользователям ссылаться на содержимое вашего сайта всегда проблематично.

5
ответ дан 29 November 2019 в 20:28
поделиться

Перед вставкой в базу данных используйте imagemagik для проверки того, что фотография является реальным изображением, а не чем-то другим, и все будет в порядке.

2
ответ дан 29 November 2019 в 20:28
поделиться

Нет смысла проверять расширение файла, так как это не гарантирует, что он не обрабатывается скриптом. GET-запросы (используемые в img src) должны быть безопасными и не должны вызывать серьезных изменений состояния (например, покупка, удаление пользователя и т.д.). Однако есть сайты с ошибками, которые делают это.

Таким образом, самым безопасным решением является требование к пользователям загружать изображение на ваш сайт. Если вы разрешаете удаленные изображения, вы должны, по крайней мере, требовать схему http или https.

1
ответ дан 29 November 2019 в 20:28
поделиться

Помимо того, что другие говорили о гнусных намерениях, я вижу еще одну проблему, если на изображении есть что-то действительно ужасное, но тогда это может произойти на любом веб-сайте, где вы можно загружать изображения.

Если вы действительно разрешаете пользователям загружать изображения, вы можете проверить тип mime (эту информацию может предоставить функция PHP getimagesize ()). Это тоже не пуленепробиваемое, но лучше, чем просто проверить расширение.

0
ответ дан 29 November 2019 в 20:28
поделиться

Будете ли вы размещать файлы на своем веб-сервере, загружая "куда-нибудь"?

Существует множество потенциальных проблем:

<img src="http://hacker.ru/badtimes.php" />
<img src="javascript:alert(String.fromCharCode(88,83,83))" />

Кроме того, специально созданные файлы jpgs могут заразить компьютеры пользователей: http://www.microsoft.com/technet/security/bulletin/ms04-028.mspx

0
ответ дан 29 November 2019 в 20:28
поделиться

Вы можете использовать регулярное выражение для фильтрации URL-адресов в PHP. Таким образом вы можете предотвратить вызов тегов javascript и указать допустимые расширения файлов.

0
ответ дан 29 November 2019 в 20:28
поделиться

Нет, это совсем не безопасно, XSS-атаки могут выполняться через теги изображений.

Простой пример:

<IMG SRC=j&#X41vascript:alert('test2')>

http://www.owasp.org/index.php/Cross-site_Scripting_%28XSS%29

12
ответ дан 29 November 2019 в 20:28
поделиться

Пара вещей, которые нужно сделать, это проверить, что это реальное изображение в принятом формате (обычно jpg, png и gif), а также санировать и изменить имя файла.

Вы можете использовать функцию PHP getimagesize, чтобы проверить, является ли это действительным изображением, и в каком формате. Вы получаете предполагаемый MIME-тип при загрузке файла, но это бесполезно для проверки. Итак, следующее должно работать, поскольку функция getimagesize также проверяет изображения и возвращает тип exif.

$image_info=getimagesize($tempname);

$allowed_types=array(IMAGETYPE_PNG,IMAGETYPE_JPEG,IMAGETYPE_GIF);//these are actually the integers 1, 2 and 3

if(in_array($image_info[2],$allowed_types)){
   //image is a valid image. You can also check the height and width.
   }

При обработке загрузки дать файлу новое уникальное имя, которое вы выбрали, - хорошая идея, и тогда вам не придется беспокоиться о том, что они сделают что-то странное с именем файла.

Редактировать: Я заметил, что вы имеете в виду пользователей, предоставляющих URL-адрес изображения.

Ответ, который я дал, относится к приему, хранению и отображению изображений, загруженных пользователями на ваш сервер.

Однако те же принципы применимы и для отображения URL-адреса изображения. Вы можете получить изображение через cURL или fopen, сохранить его во временный файл, а затем проверить, действительно ли это изображение, как описано выше. Это также может поймать пользователя, ссылающегося на несуществующее или недопустимое изображение, и предупредить его. Кроме того, установите ограничение на размер файла/размер - вы же не хотите, чтобы кто-то разместил в своем профиле ссылку на картинку размером 5 Гб (хотя это будет его собственная проблема с пропускной способностью), так как это может доставить неудобства другим пользователям. Однако пользователь всегда может изменить файл на что-то другое позже. Можно проверять раз в x часов и предупреждать людей, которые делают что-то подозрительное, но это, кажется, требует больших усилий с вашей стороны.

Вы также можете ввести правила для имен файлов, например, запретить использование юникода в именах файлов, и имя не должно включать <>''''"# - - символы, которые редко встречаются в легитимных URL-адресах изображений.

5
ответ дан 29 November 2019 в 20:28
поделиться

Предположим, вы уже выполняете дезинфекцию для внедрения SQL. Вам нужно запретить пользователю делать что-то вроде этого:

<img src="http://usmilitary/launchAllNukes?When=Now" />

или:

<img src""<script>//Evil code</script>" height="123px" width="123px" />
2
ответ дан 29 November 2019 в 20:28
поделиться

Собственно говоря - да. Я могу разместить на вашем сайте изображение, размещенное на моем сервере.

<img alt="Kobi's Photo" src="http://example.com/photo.jpg" />

Выглядит достаточно невинно, но на самом деле каждого посетителя вашего сайта, смотрящего мое изображение, можно отследить и записать. Каждый посетитель получит сеанс на моем сервере, и ему даже может быть предоставлен файл cookie (не для развлечения). Что еще хуже, я могу отслеживать каждую страницу, просмотренную вашими посетителями, на которой отображается моя фотография - браузер отправляет каждый URL-адрес, на котором отображается фотография, через заголовок реферера.
Позволяя людям размещать свои собственные фотографии, вы отдаете некоторую конфиденциальность своим посетителям.

2
ответ дан 29 November 2019 в 20:28
поделиться

Если вы разрешите пользователям указывать любой URL в качестве изображения профиля, злоумышленник может использовать это для атаки типа "отказ в обслуживании" на небольшой сайт. Ее воздействие на целевой сайт эквивалентно попаданию в slashdotted. Например, злоумышленник может изменить URL-адрес изображения профиля на большой ресурс, размещенный на целевом сайте. Каждый раз, когда посетитель вашего сайта видит профиль злоумышленника, целевой сайт тратит пропускную способность, обслуживая ресурс для посетителя.

Решением этой проблемы может быть разрешение только тех URL-адресов изображений профиля, которые ссылаются на сайты хостинга изображений.

2
ответ дан 29 November 2019 в 20:28
поделиться
Другие вопросы по тегам:

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