Как предотвратить внедрение XSS, позволяя пользователям публиковать внешние изображения - PullRequest
5 голосов
/ 14 февраля 2011

Пользователь недавно сообщил мне, что он может использовать тег BBCode [img], который был доступен им на форумах.

[img=http://url.to.external.file.ext][img]

Конечно, он будет отображаться как разорванное изображение, однако браузер получит файл там. Я сам проверил и убедился, что это законно.

Я не уверен, как предотвратить этот тип инъекций XSS, кроме загрузки изображения и проверки, является ли оно допустимым изображением через PHP. Это легко может быть использовано с безумно огромным файлом.

Есть ли другие способы решения этой проблемы?

Ответы [ 2 ]

2 голосов
/ 28 февраля 2011

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

Некоторые ошибки, если вы решили загрузить изображения -

  1. Убедитесь, что у вас есть проверка на максимальный размер файла.Существуют способы остановить загрузку, если размер файла превышает определенный размер, но это зависит от языка.
  2. Убедитесь, что файл на самом деле является изображением.диск, обязательно переименуйте его.Вы не должны позволять пользователю контролировать имя файла в системе.
  3. Когда вы обслуживаете изображения, используйте выделенный домен или используйте голый IP-адрес для обслуживания изображений.Если браузер обманут, думая, что изображение является исполняемым кодом, политика того же происхождения предотвратит дальнейшее повреждение.
2 голосов
/ 14 февраля 2011

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

Edit:

Извините, что не смог ответить более подробно; Я наслаждался ужином.

Есть два способа увидеть это:

  1. Вы проверяете, является ли указанный адрес действительно изображением, когда сообщение отправляется или просматривается, вы можете сделать это, проверив заголовки (убедившись, что это действительно изображение) или используя расширение файла. Это не защищает от ошибок и имеет некоторые очевидные проблемы (изменение изображения на лету и т. Д.).
  2. Защитите свой сайт, чтобы даже при наличии компромисса с тегом [img] реальной проблемы не возникало, например: вредоносный код не может использовать украденные файлы cookie.
  3. Используйте скрипт, который запрашивает внешнее изображение и изменяет заголовки.

Основной способ проверки типа содержимого удаленных файлов:

$Headers = get_headers('http://url.to.external.file.ext');
if($Headers[8] == 'text/html') {
    echo 'Wrong content type.';
    exit;
}
...