@venaf34228

Достаточно ли безопасен данный способ загрузки файлов?

Добрый день!
Достаточно ли безопасен данный способ для загрузки изображений на сервер?
upload.php
<?php
$AllowFileExtension = array(
    'jpg',
    'png',
    'jpeg'
);
$FileExtension      = pathinfo(strtolower($_FILES['file']['name'][0]), PATHINFO_EXTENSION);
if (!in_array($FileExtension, $AllowFileExtension)) {
    die('Разрешенные форматы файла: jpg, jpeg, png.');
}
$TempName = $_FILES['file']['tmp_name'][0];
if (filesize($TempName) > 10485760) {
    die('Размер изображения не должен превышать 10МБ.');
}
$imageinfo = getimagesize($TempName);
if ($imageinfo['mime'] != 'image/jpeg' && $imageinfo['mime'] != 'image/png') {
    die('Разрешенные форматы файла: jpg, jpeg, png.');
}
$NewFileName  = (md5(uniqid() . strtolower($_FILES['file']['name'][0]))) . '.' . $FileExtension;
$UploadDir    = "/img/";
$NewFilePatch = $UploadDir . $NewFileName;
if (!is_writable($UploadDir)) {
    die('Каталог недоступен для записи.');
}
$CopyFile = copy($TempName, $NewFilePatch);
if (!$CopyFile) {
    die('Неудалось сохранить файл.');
}
?>

В папке img находится .htaccess со следующем содержанием
<FilesMatch "\.(php|cgi|pl|php3|php4|php5|php6|phps|phtml|shtml|py)$">
Order allow,deny
Deny from all
</FilesMatch>
  • Вопрос задан
  • 84 просмотра
Пригласить эксперта
Ответы на вопрос 2
megakor
@megakor
Go/PHP developer | Вконтакте
Проверять расширение файла нужно по его MIME типу. Через pathinfo проверку можно убрать - она лишняя.
Перемещать файл из tmp нужно через move_uploaded_file(), а не через copy().

Бонусы:
1. Используйте camelCase - не делайте переменные с заглавными буквами (выглядит не очень).
2. Делайте проверку isset($_FILES['file']['name'][0]) вначале, иначе если файл никакой не был загружен - вернет ошибку (т.к. вы ссылаетесь на элемент массива, который может не существовать).
Ответ написан
Комментировать
xmoonlight
@xmoonlight
https://sitecoder.blogspot.com
Ожидаете картинку - проверьте свойства файла нужного формата. Например, разрешение изображения перед перемещением из upload.

Фильтр (любой) - не "запрещение того, что помню", а "разрешение того, что жду".
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы