Должен ли я проверить НЕ В "exe | bat | php | js" и разрешить все другие типы?
Нет. Белый список лучше, чем черный. Существует много, гораздо более опасных типов файлов, о которых вы, вероятно, не знаете. Эти четыре едва царапают поверхность.
Если я добавлю "xml" в список? могут ли они вызвать какие-либо проблемы безопасности?
Да, может, [X] [HT] ML может содержать сценарии, которые работают в контексте безопасности сайта, который его обслуживал. Это позволяет любому, кто может загружать документы на ваш сайт, вставлять JavaScript на ваш сайт (кража файлов cookie, подделка запросов и т. Д.).
Однако ... на самом деле это не добавляет проблем безопасности, которых у вас еще нет. Потому что даже белый список по типу / расширению файла небезопасен, благодаря IE и его ненадлежащему анализу типов. Вы можете загрузить файл .txt
и правильно его обработать, используя заголовок Content-Type: text/plain
, но если он содержит последовательности, которые IE считает похожими на HTML, IE проигнорирует вас и отобразит его как HTML - boom, XSS.
(То же самое верно и для любого другого типа, но .txt наиболее уязвим.)
Существует два подхода к исправлению этого беспорядка:
обслуживать все загруженные пользователями файлы с другого имени хоста на основной сайт приложения, чтобы они находились в разных контекстах безопасности JS и не разделяли файлы cookie или данные аутентификации.
обслуживать все загруженные пользователем файлы с заголовком Content-Disposition: attachment
, чтобы они всегда загружались и не отображались в браузере.
(2) сам по себе должен быть водонепроницаемым, но на практике в прошлом были способы обойти это из-за эксплойтов браузера и плагинов, поэтому я не уверен, что полностью доверю этому. (1) сам по себе останавливает XSS, но не останавливает другие неприятности, такие как HTML-файлы, содержащие фреймы для использования сайтов.
Так что лучше всего сделать и то и другое.