Я пытаюсь разработать небольшую социальную сеть и хотел бы знать, достаточно ли следующего подхода, чтобы сделать мой «сценарий загрузки файлов» максимально безопасным. Я хочу, чтобы мои пользователи загружали изображения [jpeg, jpg, png, gif], видео [3gp, wma, mp4] и mp3-файлы. Я рассмотрел многие вопросы здесь, в SO, но большинство из них, похоже, имеют дело с загрузкой изображений в деталях, а не с видео и mp3. Я хотел бы знать, что еще я могу сделать, чтобы сделать скрипт доступным для загрузки скриптом msot. [да, я довольно параноидальный о безопасности и определенно хочу, чтобы мой сайт был известен своей безопасностью, а не скоростью). Мой текущий подход заключается в следующем:Что такое самый безопасный способ загрузки файлов php, который может обрабатывать все типы файлов?
- проверить, если пользователь зарегистрирован (путем проверки сеанса)
- проверки, если файл загружается без ошибок
- чек, если размер файла находится в допустимом диапазоне
- дезинфицировать имя файла
- получить расширение файла и проверить, разрешено ли его расширение
- получить тип mime и проверить, является ли он допустимым типом mime
- генерировать новое случайное имя файла
- правило набора .htaccess для папки вне public_html и использовать его в магазин загруженных файлов
- использовать move_uploaded_file()
- использование CHMOD(), чтобы установить «0644» в качестве разрешения на загруженный файл
В файле .htaccess будут добавлены следующие:
SetHandler none
SetHandler default-handler
Options -ExecCGI
php_flag engine off
ForceType application/octet-stream
<FilesMatch "(?i)\.jpe?g$">
ForceType image/jpeg
</FilesMatch>
<FilesMatch "(?i)\.gif$">
ForceType image/gif
</FilesMatch>
<FilesMatch "(?i)\.png$">
ForceType image/png
</FilesMatch>
<FilesMatch "(?i)\.mp3$">
ForceType audio/mpeg
</FilesMatch>
<FilesMatch "(?i)\.mp4$">
ForceType video/mp4
</FilesMatch>
код, который я пытаюсь это следующим образом:
$fileInput = $_FILES['image'];
$sizeLimit="4000";
if($fileInput['error'] === UPLOAD_ERR_OK && isset($fileInput['tmp_name'])){
if($fileInput['size'] < $sizeLimit){
$cleanedName=stripslashes($fileInput['name']); //cleaning file name
$checking = pathinfo($cleanedName); //finding extension
$ext=$checking['extension'];
$finfo = finfo_open(FILEINFO_MIME_TYPE); // find mime type
$mimetype = finfo_file($finfo, $fileInput['tmp_name']);
finfo_close($finfo);
.
.
.//generate random name and use move_uploaded_file() and chmod()
}
}
Является ли этот подход достаточно, чтобы держать мой сайт безопасным, или есть какие-то явные недостатки этого метода ?. Заранее спасибо за вашу помощь.
Если вы хотите быть более безопасным, убедитесь, что у вас есть SSL. Что касается самих загрузок, файл - это просто файл, независимо от его типа, а более крупные файлы или файлы определенного типа не являются более жесткими или менее безопасными. – GolezTrol
@GolezTrol Спасибо. Да, я обязательно использую SSL. Я заметил, что большинство пользователей на SO в основном предлагают использовать GD, чтобы проверить, является ли загрузка изображением, но есть ли такой метод проверки для видео и аудио, чтобы быть более уверенным в файлах ?. Мой подход оставляет любые зияющие лазейки, которые можно легко манипулировать? – newbiePrgrmr