2010-10-13 3 views
5

У нас есть внутреннее веб-приложение, которое действует как репозиторий, к которому пользователи могут загружать файлы. Эти файлы могут быть любого формата, включая HTML-страницы.Как избежать XSS при загрузке HTML?

Мы тестировали, чем в IE8, если вы загружаете HTML-файл, содержащий некоторый скрипт, который пытается получить доступ к вашим файлам cookie, и после загрузки вы выбираете опцию «Открыть», скрипт выполняет и получает вашу информацию о файлах cookie без проблемы вообще.

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

Есть ли способ избежать этого? Мы протестировали, что и Chrome, и Firefox не позволяют этому случиться. Как можно избежать такого поведения в любом браузере, включая IE8?

+2

Что делает «Open» на самом деле? Показать страницу в браузере? Если да, то каков URL страницы, когда это происходит? – bzlm

+0

@bzlm: Это как с любым приложением; если вы заставляете браузер запрашивать окно загрузки (содержимое), вы все равно можете открыть его, и он открывается с использованием URL-адреса, используемого для его загрузки, который, очевидно, находится в том же домене, что и его файлы cookie, поэтому мое предложение (загрузки) в альтернативном домене. –

+0

@bzlm находится на правильном пути: если вы открываете HTML-файл локально, он не сможет обращаться к куки-файлам и не выдавать запросы Ajax на удаленный сервер из-за политики единого домена. Только если он открывается непосредственно на сервере, что возможно. –

ответ

5

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

Одним из возможных «решений» может быть размещение только ненадежных загрузок в домене, в котором нет файлов cookie, и что пользователь никоим образом не связывает какое-либо доверие. Это было бы «решением», но, конечно, не идеальным.

Некоторые более практичные варианты могут быть основаны на авторизации, где каждый файл проходит автоматическую проверку, а затем вручную подтверждает автоматическую фазу очистки/анализа.

В целом, однако, это очень плохая идея, чтобы позволить широкой общественности сделать это.

+1

+1 для хранения загрузок в другом домене и общее представление о том, что это всегда опасно –

+0

Мы рассмотрим возможность загрузки файлов из другого домена и будем следить за системой, чтобы убедиться, что мы в конечном итоге вынужден отказаться от любой опасной загрузки. Большое спасибо за вашу помощь. –

+0

[GitHub выпускает] (https://github.com/cirosantilli/test/releases/tag/3.0) разрешает любое расширение и, кажется, использует решение домена через S3. Dropbox также позволяет произвольные типы файлов. –

1

Если вам действительно нужно, чтобы пользователи загружали HTML-файлы, вы должны убедиться, что файлы HTML в этом каталоге обслуживаются с типом mime type/plain, а не text/html или аналогичным.

Это предотвратит запуск открытых файлов в браузере. Если вы используете apache, см. Директиву AddType.

+0

Это хорошее предложение и может сделать трюк. Я все равно буду беспокоиться о том, чтобы обслуживать контент из того же домена, но я думаю, что это, вероятно, должно быть сделано независимо. –

+0

Остерегайтесь содержания нюхать. Поскольку Apache поставляется с 'text/plain' по умолчанию для неизвестных файлов, браузеры вынуждены рассматривать' text/plain' как приглашение для угадывания фактического типа. – Kornel

4

Это очень плохая идея с точки зрения безопасности. Тем не менее, если вы хотите сделать это, включите заголовок ответа HTTP Content-disposition: attachment. Это заставит браузер загружать файл, а не открывать его. В Apache это делается путем добавления Header set Content-disposition "attachment" в файл .htaccess.

Обратите внимание, что это плохая идея просто добавить Content-type: text/plain, как указано в одном из ответов, потому что это не будет работать для Internet Explorer. Когда IE получает файл с заголовком text/plain content-type, он включает свой имитатор MIME, который пытается определить реальный тип содержимого файла (поскольку некоторые серверы отправляют все файлы с текстом/plain). Если он встречает HTML-код внутри файла, он заставит браузер обслуживать файл как text/html и отображать его.

+0

[Это сообщение в блоге] (http://i8jesus.com/?p=64) говорит, что просто «Content-Disposition» недостаточно, но я недостаточно знаю, насколько он надежный и по-прежнему применяется. –

Смежные вопросы