Файл uploads.php в Cotonti

отвечает за управление загрузкой файлов в систему, предоставляя ряд функций для обработки, проверки и обеспечения безопасности загружаемых файлов.

Файл uploads.php в системной папке Cotonti CMF отвечает за управление загрузкой файлов в систему, предоставляя ряд функций для обработки, проверки и обеспечения безопасности загружаемых файлов. Основные задачи и функции, реализуемые в этом файле, включают:

  1. Проверка валидности загружаемых файлов:

    • Функция cot_file_check проверяет, является ли файл безопасным для загрузки, проверяя его расширение и тип MIME. Это позволяет предотвратить загрузку опасных файлов, которые могут быть использованы для выполнения вредоносных действий (например, скриптов или вирусов).
    • Файл проверяется на соответствие указанному типу (например, изображениям в формате JPG, PNG, GIF). В случае изображений проверяется их MIME-тип с помощью библиотеки getimagesize.
  2. Определение максимального размера файла:

    • Функция cot_get_uploadmax определяет максимальный размер файла, который можно загрузить, основываясь на значениях настроек PHP (upload_max_filesize, post_max_size, memory_limit). Это помогает системе контролировать и ограничивать размер загружаемых файлов, предотвращая загрузку слишком больших файлов, которые могут повлиять на производительность или безопасность.
  3. Генерация безопасного имени для файла:

    • Функция 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

Оффлайн

Administrator

Последняя авторизация: 03.08.2026 13:51

  • Страница размещена: 24.01.2025 12:18
  • Последнее обновление: 24.01.2025 12:21