Файл uploads.php в Cotonti
отвечает за управление загрузкой файлов в систему, предоставляя ряд функций для обработки, проверки и обеспечения безопасности загружаемых файлов.
Опубликовано в: Cotonti - чтиво. Документация.
Файл uploads.php в системной папке Cotonti CMF отвечает за управление загрузкой файлов в систему, предоставляя ряд функций для обработки, проверки и обеспечения безопасности загружаемых файлов. Основные задачи и функции, реализуемые в этом файле, включают:
-
Проверка валидности загружаемых файлов:
- Функция
cot_file_checkпроверяет, является ли файл безопасным для загрузки, проверяя его расширение и тип MIME. Это позволяет предотвратить загрузку опасных файлов, которые могут быть использованы для выполнения вредоносных действий (например, скриптов или вирусов). - Файл проверяется на соответствие указанному типу (например, изображениям в формате JPG, PNG, GIF). В случае изображений проверяется их MIME-тип с помощью библиотеки
getimagesize.
- Функция
-
Определение максимального размера файла:
- Функция
cot_get_uploadmaxопределяет максимальный размер файла, который можно загрузить, основываясь на значениях настроек PHP (upload_max_filesize,post_max_size,memory_limit). Это помогает системе контролировать и ограничивать размер загружаемых файлов, предотвращая загрузку слишком больших файлов, которые могут повлиять на производительность или безопасность.
- Функция
-
Генерация безопасного имени для файла:
- Функция
cot_safenameзанимается преобразованием имени загружаемого файла в безопасный формат, который не содержит небезопасных символов. Она также поддерживает транслитерацию для языков, отличных от английского, и может преобразовывать пробелы в подчеркивания. Это помогает избежать проблем с файловыми системами и предотвращает угрозы безопасности, такие как инъекции через имя файла.
- Функция
Таким образом, основной функцией этого файла является обеспечение безопасного и эффективного процесса загрузки файлов в систему. Он включает в себя проверку на безопасность файлов, ограничения на размер, а также приведение имен файлов в безопасный вид, что особенно важно для защиты от различных атак через файлы.
/**
* Помощники для загрузки файлов
*
* @package API - Загрузки
* @copyright (c) Cotonti Team
* @license https://github.com/Cotonti/Cotonti/blob/master/License.txt
*/
defined('COT_CODE') or die('Неверный URL'); // Проверка на правильность вызова кода (не из внешнего источника)
/**
* Проверяет файл на допустимость
*
* @param string $path Путь к файлу
* @param string $name Имя файла
* @param string $ext Расширение файла
* @return bool
*/
function cot_file_check($path, $name, $ext) // Функция для проверки файла на допустимость
{
if (!Cot::$cfg['pfs']['pfsfilecheck']) { // Если проверка файлов отключена в настройках
return true; // Возвращаем true, так как проверка не требуется
}
require './datas/mimetype.php'; // Подключаем файл с типами MIME
$fcheck = false; // Изначально флаг проверки установлен в false
if (in_array($ext, array('jpg', 'jpeg', 'png', 'gif'))) { // Если расширение файла одно из допустимых для изображений
$img_size = @getimagesize($path); // Получаем размер изображения и его свойства
switch($ext) { // В зависимости от расширения файла
case 'gif': // Для gif
$fcheck = isset($img_size['mime']) && $img_size['mime'] == 'image/gif'; // Проверка MIME-типа для gif
break;
case 'png': // Для png
$fcheck = isset($img_size['mime']) && $img_size['mime'] == 'image/png'; // Проверка MIME-типа для png
break;
default: // Для jpeg
$fcheck = isset($img_size['mime']) && $img_size['mime'] == 'image/jpeg'; // Проверка MIME-типа для jpeg
break;
}
$fcheck = $fcheck !== false; // Если результат проверки не false, значит файл допустим
} else { // Если расширение файла не одно из разрешенных
if (!empty($mime_type[$ext])) { // Если для данного расширения есть MIME-тип
foreach ($mime_type[$ext] as $mime) { // Проходим по всем возможным MIME-типа
$content = file_get_contents($path, 0, NULL, $mime[3], $mime[4]); // Читаем содержимое файла по определенным байтам
$content = ($mime[2]) ? bin2hex($content) : $content; // Преобразуем в hex, если требуется
$mime[1] = ($mime[2]) ? strtolower($mime[1]) : $mime[1]; // Приводим MIME-тип к нижнему регистру, если нужно
if ($content == $mime[1]) { // Если содержимое файла совпало с ожидаемым MIME-типом
$fcheck = TRUE; // Устанавливаем флаг проверки в true
break; // Выходим из цикла, так как файл прошел проверку
}
}
} else { // Если MIME-тип для расширения не найден
$fcheck = (Cot::$cfg['pfs']['pfsnomimepass']) ? 1 : 2; // В зависимости от настроек, пропускаем или не пропускаем файл
cot_log(sprintf(Cot::$L['pfs_filechecknomime'], $ext, $name), 'sec', 'file_upload', 'error'); // Логируем ошибку отсутствия MIME-типа
}
}
if (!$fcheck) { // Если файл не прошел проверку
cot_log(sprintf(Cot::$L['pfs_filecheckfail'], $ext, $name), 'sec', 'file_upload', 'error'); // Логируем ошибку загрузки файла
}
return $fcheck; // Возвращаем результат проверки (true или false)
}
/**
* Возвращает максимальный размер для загружаемого файла в KiB (разрешено в php.ini, и может быть разрешено в .htaccess)
*
* @return int
*/
function cot_get_uploadmax() // Функция для получения максимального размера загружаемого файла
{
static $par_a = ['upload_max_filesize', 'post_max_size', 'memory_limit',]; // Массив с параметрами конфигурации для размеров файлов
static $opt_a = ['G' => 1073741824, 'M' => 1048576, 'K' => 1024,]; // Массив для конвертации единиц измерения (G, M, K) в байты
$val_a = []; // Массив для хранения значений параметров
foreach ($par_a as $par) { // Проходим по каждому параметру конфигурации
$val = ini_get($par); // Получаем значение параметра из php.ini
$opt = strtoupper($val[strlen($val) - 1]); // Определяем последнюю букву значения, чтобы понять его единицу измерения (G, M, K)
$val = isset($opt_a[$opt]) ? (int) $val * $opt_a[$opt] : (int) $val; // Преобразуем значение в байты в зависимости от единицы измерения
if ($val > 0) { // Если значение больше 0
$val_a[] = $val; // Добавляем значение в массив
}
}
return (int) floor(min($val_a) / 1024); // Возвращаем минимальное значение из массива, преобразованное в KiB
}
/**
* Убирает все небезопасные символы из базового имени файла и конвертирует его в латиницу
*
* @param string $basename Базовое имя файла
* @param bool $underscore Преобразовывать ли пробелы в подчеркивания
* @param string $postfix Постфикс, добавляемый к имени файла
* @return string
*/
function cot_safename($basename, $underscore = true, $postfix = '') // Функция для создания безопасного имени файла
{
global $lang, $cot_translit;
if (!$cot_translit && $lang != 'en' && file_exists(cot_langfile('translit', 'core'))) { // Если транслитерация не включена и язык не английский
require_once cot_langfile('translit','core'); // Подключаем файл с настройками транслитерации
}
$fname = mb_substr($basename, 0, mb_strrpos($basename, '.')); // Получаем имя файла без расширения
$ext = mb_substr($basename, mb_strrpos($basename, '.') + 1); // Получаем расширение файла
if ($lang != 'en' && is_array($cot_translit)) { // Если язык не английский и транслитерация активирована
$fname = cot_translit_encode($fname); // Применяем транслитерацию к имени файла
}
if ($underscore) { // Если нужно преобразовывать пробелы в подчеркивания
$fname = str_replace(' ', '_', $fname); // Заменяем пробелы на подчеркивания
}
$fname = str_replace('..', '.', $fname); // Заменяем двойные точки на одну (защита от путей вроде "../")
$safename = preg_replace('#[^a-zA-Z0-9\-_\.\ \+]#', '', $fname); // Убираем все символы, кроме латинских букв, цифр, дефиса, подчеркивания, точки, пробела и плюса
if (empty($safename)) { // Если имя файла пустое после очистки
$fname = $safename . cot_unique(); // Добавляем уникальный идентификатор
}
return $fname . $postfix . '.' . mb_strtolower($ext); // Возвращаем безопасное имя файла с расширением
}
6 минут чтения Administrator
Комментарии (0)
Комментарии отсутствуют
Добавление комментариев доступно только зарегистрированным пользователям
Автор контента
Оффлайн
Administrator
Последняя авторизация: 03.08.2026 13:51
- Страница размещена: 24.01.2025 12:18
- Последнее обновление: 24.01.2025 12:21
Похожих страниц не найдено