Файл uploads.php в Cotonti
отвечает за управление загрузкой файлов в систему, предоставляя ряд функций для обработки, проверки и обеспечения безопасности загружаемых файлов.
Filed under: Cotonti - reading materials. Documentation.
Файл 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 minutes read Administrator
Comments (0)
No comments yet
Only registered users can post new comments
Article multicategories
Additional categories where this article is shown as similar.Content author
Offline
Administrator
Last logged: 2026-09-13 14:50
- Page published: 2025-01-24 12:18
- Last update: 2025-01-24 12:21
No similar pages found