Я просто хочу, чтобы вы могли загружать файлы .txt или .csv.
Звучит просто, не так ли? Это не. А потом некоторые.
Простой подход состоит в том, чтобы проверить, что файл заканчивается на «.txt» или «.csv», прежде чем хранить его в файловой системе. Это должно быть частью более глубокой проверки того, как разрешено содержать имя файла, прежде чем вы дадите имя файла, поданного пользователем, около файловой системы.
Поскольку правила о том, что может происходить в имени файла, сложны на некоторых платформах (особенно Windows), обычно лучше создать собственное имя файла независимо с известным именем и расширением.
В любом случае нет гарантии, что браузер отправит вам файл с полезным именем вообще, и даже если это произойдет, нет гарантии, что имя будет иметь «.txt» или «.csv» на end, даже если это текст или CSV-файл. (Некоторые платформы просто не используют расширения для ввода текста.)
Хотя вы можете попытаться обнюхать содержимое файла, чтобы посмотреть, какой тип он может быть, это очень ненадежно. Например:
<html>,<body>,</body>,</html>
может быть простым текстом, CSV, HTML, XML или другими форматами. Лучше дать пользователю явный контроль, чтобы сказать, какой тип файла они загружают (или использовать одно поле для загрузки файла для каждого типа).
Теперь вот где это становится действительно противным. Предположим, вы приняли загрузку и сохранили ее как /data/mygoodfilename.txt, и веб-сервер правильно обслуживает ее как текст-текст/тип контента. Как вы думаете, браузер интерпретирует это как? Простой текст? Тебе должно быть повезло.
Проблема в том, что браузеры (в первую очередь IE) не доверяют заголовку Content-Type и вместо этого просматривают содержимое файла, чтобы увидеть, похоже ли оно на что-то еще. Передайте приведенный выше фрагмент как обычный текст, и IE с удовольствием рассмотрит его как HTML.Это может быть огромной проблемой, поскольку HTML может включать в себя клиентские скрипты, которые будут захватывать доступ пользователя к сайту (атака межсайтового скриптинга).
На данный момент у вас может возникнуть искушение обнюхать файл на стороне сервера, например, используя команду «файл», чтобы проверить, не содержит ли «< html>». Но это обречено на провал. Команда «файл» не нюхает для всех тех же тегов HTML, что и IE, а другие браузеры понюхают иначе. Довольно легко подготовить файл, который «файл» будет требовать, это не HTML, но этот IE, тем не менее, будет обрабатывать, как если бы он был (с последствиями для безопасности).
Подходы к обнюхиванию контента, такие как «файл», дадут вам только ложное ощущение безопасности. Это удобный инструмент для свободного угадывания типов файлов и не эффективная мера безопасности.
На данный момент ваши последние отчаянные возможности такие вещи, как:
обслуживающие все загруженные пользователями файлы из отдельного хоста, так что инъекции сценарий атаки не может похищать учетные данные вашего основного сайта;
, обслуживающий все загруженные пользователем файлы через оболочку CGI, добавляя заголовок Content-Disposition: attachment, чтобы браузеры не пытались их отображать напрямую;
только принимает закачки от доверенных пользователей.
на окружающую среду я даюсь, у них нет магии. Как можно использовать утилиту file (1) в perl? – 2009-03-30 21:20:57
Просто введите волшебный файл с вашим приложением? – jrockway