Я запускаю небольшую браузерную MMO, и у меня возникает проблема, когда пара пользователей встраивают скрипты в изображения своих профилей и используют их для атак на указанных пользователей и мою игру в целом. Есть ли способ защититься от этого или мне нужно запретить людям использовать свои собственные изображения?
Если это кому-то помогает, это делается в PHP / MySQL.
В частности, откуда берутся изображения профиля - должны ли пользователи указывать URL-адрес или загружать файлы?
пользователи предоставляют свои собственные изображения и URL-адреса, и все становится плохо, когда люди смотрят на них.
Мы до сих пор не знаем, какие именно «атаки» вас беспокоят. Откуда вы знаете, что происходит что-то вредоносное? Вы говорите об эксплойтах ошибок парсера изображений в браузере, межсайтовом сценарии JavaScript или просто о динамических изображениях, как в ответе Unkwn? (Это совершенно безвредно.)
Они ссылаются на изображение в своем аватаре, кто-то смотрит на него, и с их аккаунтом случаются неприятности. Это случалось со мной пару раз, так что я почти уверен, что не дую горячим воздухом.
Я предполагаю, что они не ссылаются на изображение, может показаться, что они ссылаются на скрипт, который выполняет атаку, я бы предложил либо загрузить изображение локально, либо разрешить пользователям выбирать локальные / загруженные файлы.






Некоторые из наиболее распространенных практик проверки целостности изображения включают проверку типа MIME или двоичное чтение первых нескольких байтов изображения. Хотя они не самые лучшие, от некоторых из них стоит попытаться отразить.
Попробуйте заставить GD обработать эти изображения. Если он выдает ошибки, вы знаете, что у вас проблема. Поскольку загрузка изображения - относительно редкая операция, она не должна вызывать проблем с загрузкой из-за каких-либо произвольных манипуляций.
Вы говорите о проблеме, при которой IE интерпретирует изображение с HTML-тегами в нем как HTML-страницу, что позволяет внедрять HTML и скрипт из изображений, отправленных пользователем?
(Ошибка в том, что IE будет делать это, даже если вы укажете ему Content-Type как изображение / тип. Microsoft вызвала бесконечные нарушения безопасности, пытаясь быть «полезными».)
Если это так, обычным решением является обслуживание отправленных пользователем изображений с другого имени хоста, у которого нет доступа к файлам cookie или сценариям на основном имени хоста, с которого вы обслуживаете свое веб-приложение.
Обязательно заблокируйте свои виртуальные серверы, чтобы сервер изображений и сервер приложений были доступны только с одного конкретного имени хоста (а сервер приложений не должен быть доступен через IP-адрес).
Это устранит проблемы межсайтового скриптинга. У вас все еще могут быть запросы на подделку межсайтовых запросов, но это уже другая проблема, и ее можно использовать без внедрения сценария, обернутого изображениями.
Скорее всего, происходит то, что они дают вам ссылку на скрипт, который создает изображение и возвращает его на лету, нет ничего, кроме разрешения пользователям использовать внешние изображения, которые вы можете с этим поделать, один вариант предотвратить это - это загрузить и сохранить изображение на вашем сервере, а не ссылаться на внешнее изображение.
- Решил предоставить образец
Это изображение создается на лету, я даю URL: http://unkwndesign.com/profilePic.png:
альтернативный текст http://unkwndesign.com/profilePic.png
теперь profilePic.png - это папка, которая по запросу предоставляет index.php, который, используя gd, получает логотип SO и накладывает на него ваш IP-адрес, чтобы было предельно ясно: Я НЕ ЗАПИСЫВАЮ ЭТИ ИЛИ ЛЮБЫЕ ДРУГИЕ ДАННЫЕ источник index.php:
<?php
$image = imagecreatefrompng("http://stackoverflow.com/Content/Img/stackoverflow-logo-250.png");
$font_size = 12;
$color = imagecolorallocate($image, 0,0,0);
ImageTTFText ($image, $font_size, 0, 55, 35, $color, "arial.ttf",$_SERVER['REMOTE_ADDR']);
header("Content-type: image/png");
imagepng($image);
imagedestroy($image);
?>
Поскольку я возвращаю изображение с правильным расширением и правильным mime-типом, невозможно определить, что я делаю. Если бы сервер загрузил мое изображение и сохранил его локально, IP-адрес был бы IP-адресом сервера, что испортило бы удовольствие от этого и, вероятно, оказалось бы достаточно обескураживающим фактором, чтобы остановить поведение.
Вы уверены, что ваш веб-сервер не регистрирует это по умолчанию? :)
Конечно, мой веб-сервер регистрирует это, но я предполагал, что это предполагалось. Точно так же следует предположить, что ваш интернет-провайдер также зарегистрировал соединение с моим сервером.
более конкретная информация о характере атаки очень поможет ... Есть несколько эксплойтов с изображениями, о которых известно ...