#php #file-upload
#php #загрузка файла
Вопрос:
Мне нужно создать веб-сайт, который позволит зарегистрированным пользователям загружать аудиофайлы. Интересно, существует ли какая-либо пуленепробиваемая практика в отношении безопасности. Сайт построен на PHP
Комментарии:
1. О какой безопасности вы беспокоитесь? Ограничение доступа к файлам, предотвращение загрузки нелегального контента, DRM и т.д.?
Ответ №1:
Проверьте mime-тип загружаемого файла
mp3 -> audio/mpeg
Подробнее здесь:http://www.w3schools.com/media/media_mimeref.asp
Ответ №2:
Вам нужно будет тщательно проверить тип файла. Это означает, что не нужно просто добавлять подстроку к имени файла, чтобы получить расширение. Расширение не является конкретным показателем того, чем на самом деле является файл.
Как сказал Данзан, вы захотите проверить MIME-тип файла, используя некоторый код, подобный этому:
if ($_FILES["audioUpload"]["type"] == "audio/mpeg") {
//proceed with upload procedure
} else {
echo "Only mp3's are allowed to be uploaded.";
}
Это сводит шансы пользователя загрузить, скажем, вредоносный PHP-код в ваш каталог загрузки практически к нулю.
Ответ №3:
Проверка типа файла на пуленепробиваемость обеспечивается с помощью комбинации getimagesize, расширения fileinfo и функции mime_content_type (свойство Nette Framework):
// $file is absolute path to the uploaded file
$info = @getimagesize($file); // @ - files smaller than 12 bytes causes read error
if (isset($info['mime'])) {
return $info['mime'];
} elseif (extension_loaded('fileinfo')) {
$type = preg_replace('#[s;].*$#', '', finfo_file(finfo_open(FILEINFO_MIME), $file));
} elseif (function_exists('mime_content_type')) {
$type = mime_content_type($file);
}
return isset($type) amp;amp; preg_match('#^S /S $#', $type)
? $type
: 'application/octet-stream';
Вы не можете доверять никаким данным, поступающим от клиента, потому что их можно легко подделать.
Комментарии:
1. Именно это я и думал о данных, отправленных пользователем. Я уже проверил расширение файла, а также тип mime, но все еще не уверен, все ли это необходимо для предотвращения внедрения вредоносного кода на сервер
2. Я думаю, что в этом случае сервер безопасен (вы не можете запустить аудиофайл как PHP-скрипт), но неизбежной проблемой все равно будет то, что пользователи могут загрузить аудиофайл с содержащимся вредоносным кодом в случае обнаружения какой-либо уязвимости (которая может быть опасна для пользователей, загружающих этот файл с вашего сервера). Но я не думаю, что вам нужно беспокоиться об этом.
Ответ №4:
Вы можете загружать что угодно с помощью PHP. Вот пример:http://www.tizag.com/phpT/fileupload.php
Что касается безопасности, вы должны убедиться, что только определенным пользователям разрешено загружать материалы, и что вы проверяете содержимое того, что они загружают (размер файла, тип файла и т.д.).