Функция cot_import в Cotonti

Функция cot_import используется для безопасного импорта данных из различных источников (например, GET, POST, COOKIE и т.д.). Она также поддерживает фильтрацию данных перед их возвратом, что позволяет валидировать и обрабатывать входные данные.

Разбор функции cot_import
Функция cot_import используется для безопасного импорта данных из различных источников (например, GET, POST, COOKIE и т.д.). Она также поддерживает фильтрацию данных перед их возвратом, что позволяет валидировать и обрабатывать входные данные.

Код функции


/**
 * Imports data from the outer world
 *
 * @param string $name Variable name
 * @param string $source Source type: G/GET, P/POST, C/COOKIE, R/REQUEST, PUT, DELETE or D/DIRECT (variable filtering)
 * @param string $filter Filter type
 * @param int $maxlen Length limit
 * @param bool $dieOnError Die with fatal error on wrong input
 * @param bool $buffer Try to load from input buffer (previously submitted) if current value is empty
 * @return mixed
 */
function cot_import($name, $source, $filter, $maxlen = 0, $dieOnError = false, $buffer = false)
{
	global $cot_import_filters, $_PUT, $_PATCH, $_DELETE;

	if (isset($_SERVER['REQUEST_METHOD'])) {
		if ($_SERVER['REQUEST_METHOD'] == 'PUT' && is_null($_PUT)) {
			parse_str(file_get_contents('php://input'), $_PUT);
		} elseif ($_SERVER['REQUEST_METHOD'] == 'PATCH' && is_null($_PATCH)) {
			parse_str(file_get_contents('php://input'), $_PATCH);
		} elseif ($_SERVER['REQUEST_METHOD'] == 'DELETE' && is_null($_DELETE)) {
			parse_str(file_get_contents('php://input'), $_DELETE);
		}
	}

	$v = null;
	switch($source) {
		case 'G':
		case 'GET':
			$v = (isset($_GET[$name])) ? $_GET[$name] : null;
			$log = true;
			break;

		case 'P':
		case 'POST':
			$v = (isset($_POST[$name])) ? $_POST[$name] : null;
			$log = true;
			break;

		case 'PUT':
			$v = (isset($_PUT[$name])) ? $_PUT[$name] : null;
			$log = true;
			break;

		case 'PATCH':
			$v = (isset($_PATCH[$name])) ? $_PATCH[$name] : null;
			$log = true;
			break;

		case 'DELETE':
			$v = (isset($_DELETE[$name])) ? $_DELETE[$name] : null;
			$log = true;
			break;

		case 'R':
		case 'REQUEST':
			$v = (isset($_REQUEST[$name])) ? $_REQUEST[$name] : null;
			$log = true;
			break;

		case 'C':
		case 'COOKIE':
			$v = (isset($_COOKIE[$name])) ? $_COOKIE[$name] : null;
			$log = true;
			break;

		case 'D':
		case 'DIRECT':
			$v = $name;
			$log = false;
			break;

		default:
			cot_diefatal(
                'Unknown source for a variable : <br />Name = ' . $name . '<br />Source = ' . $source
                . ' ? (must be G, P, C or D)'
            );
			break;
	}

	if (is_array($v)) {
		if ($filter === 'NOC') {
            $filter = 'ARR';
        }
		if ($filter !== 'ARR') {
            return null;
        }
	}

	if (
        $buffer
        && (($v === null || $v === '') || ($filter === 'ARR' && $v === []))
    ) {
        return cot_import_buffered($name, $v, null);
	}

	if ($v === null) {
		return null;
	}

	if ($maxlen > 0) {
		$v = mb_substr($v, 0, $maxlen);
	}

	$pass = false;
	$defret = null;

	// Custom filter support
	if (!empty($cot_import_filters[$filter]) && is_array($cot_import_filters[$filter])) {
		foreach ($cot_import_filters[$filter] as $func) {
			$v = $func($v, $name);
		}
		return $v;
	}

	switch ($filter) {
		case 'INT':
			if (is_numeric($v) && floor($v) == $v) {
				$pass = true;
				$v = (int) $v;
			}
			break;

		case 'NUM':
			if (is_numeric($v)) {
				$pass = true;
				$v = (float) $v;
			}
			break;

		case 'TXT':
			$v = trim($v);
            $pass = true;
//			if (mb_strpos($v, '<') === false) {
//				$pass = true;
//			} else {
//				$defret = $v;
//			}
			break;

		case 'ALP':
			$v = trim($v);
			$f = cot_alphaonly($v);
			if ($v == $f) {
				$pass = true;
			} else {
				$defret = $f;
			}
			break;

		case 'HTM':
			$v = trim($v);
			$pass = true;
			break;

		case 'ARR':
			$pass = true;
			break;

		case 'BOL':
            if (in_array($v, [true, 1, '1', 'on'], true)) {
				$pass = true;
				$v = true;
            } elseif (in_array($v, [false, 0, '0', 'off'], true)) {
				$pass = true;
				$v = false;
			} else {
				$defret = false;
			}
			break;

		case 'NOC':
			$pass = true;
			break;

		default:
			cot_diefatal(
                'Unknown filter for a variable : <br />Var = '.$v.'<br />Filter = &quot;'.$filter.'&quot; ?'
            );
			break;
	}

	if (!$pass || !in_array($filter, ['INT', 'NUM', 'BOL', 'ARR'], true)) {
		$v = preg_replace('/(&#\d+)(?![\d;])/', '$1;', $v);
	}
	if ($pass) {
		return $v;
	} else {
		if ($log) {
			cot_log_import($source, $filter, $name, $v);
		}
		if ($dieOnError) {
			cot_diefatal('Wrong input.');
		} else {
			return $defret;
		}
	}

    return null;
}

 


Описание:

cot_import($name, $source, $filter, $maxlen = 0, $dieOnError = false, $buffer = false)


Параметры:

$name: Имя переменной, которую нужно получить.
$source: Источник, откуда брать данные. Возможные значения:
'G' или 'GET' — данные из глобального массива $_GET
'P' или 'POST' — данные из глобального массива $_POST
'PUT' — данные из массива $_PUT
'PATCH' — данные из массива $_PATCH
'DELETE' — данные из массива $_DELETE
'R' или 'REQUEST' — данные из массива $_REQUEST
'C' или 'COOKIE' — данные из массива $_COOKIE
'D' или 'DIRECT' — переменная передается напрямую, а не из глобальных массивов
$filter: Фильтр для обработки данных. Возможные значения:
'INT' — целое число
'NUM' — числовое значение
'TXT' — текст (строка)
'ALP' — строка, содержащая только буквы, цифры, дефисы и подчеркивания
'HTM' — строка (для HTML-контента)
'ARR' — массив
'BOL' — логическое значение
'NOC' — без изменений
$maxlen: Максимальная длина строки. Если длина строки превышает это значение, она будет обрезана.
$dieOnError: Если true, в случае ошибки выполнения произойдет завершение работы с сообщением об ошибке.
$buffer: Если true, функция будет использовать буферизацию данных.


Логика работы:


Обработка HTTP-запроса:

В начале проверяется метод запроса (GET, POST, PUT, PATCH, DELETE),

и если это один из них, то данные из соответствующего глобального массива (например, $_GET, $_POST) извлекаются и сохраняются в переменную $v.
Проверка на пустоту и буферизацию:

Если указано, что нужно использовать буферизацию ($buffer = true), и если переменная $v пуста или не существует (например, пустое значение или массив), вызывается функция cot_import_buffered().
Ограничение по длине:

Если передан параметр $maxlen и значение переменной $v слишком длинное, оно будет обрезано с помощью функции mb_substr().
Поддержка пользовательских фильтров:

Если для фильтра $filter настроены пользовательские функции в массиве $cot_import_filters, они будут применяться к данным.
Обработка данных в зависимости от фильтра:

 

В зависимости от фильтра (INT, NUM, TXT, и т.д.) данные обрабатываются:


INT: Преобразует значение в целое число, если оно является числовым.
NUM: Преобразует значение в число с плавающей запятой, если оно является числовым.
TXT: Обрезает пробелы с обеих сторон строки.
ALP: Удаляет все символы, не являющиеся буквами, цифрами, дефисами или подчеркиваниями.
HTM: Удаляет пробелы с обеих сторон строки.
ARR: Ожидается, что переменная является массивом.
BOL: Преобразует строку в булево значение (true/false).
NOC: Возвращает данные без изменений.

 


Обработка ошибок:

Если фильтрация не прошла успешно или данные не могут быть приведены к требуемому типу, и если флаг $dieOnError установлен в true, вызывается функция cot_diefatal() для завершения работы с сообщением об ошибке.
В противном случае возвращается значение по умолчанию, если оно задано, или null.
Логирование:

Если данные были успешно обработаны, и если переменная $log равна true, то функция записывает информацию о процессе импорта с помощью функции cot_log_import().


Пример использования:

$s = cot_import('s', 'G', 'TXT'); // section cat
$q = cot_import('q', 'G', 'INT');  // Topic id
$p = cot_import('p', 'G', 'INT'); // Post id

 


// Получение параметра 'username' из массива GET, фильтруя как строку
$username = cot_import('username', 'GET', 'TXT');

 

// Получение параметра 'age' из массива POST, фильтруя как целое число
$age = cot_import('age', 'POST', 'INT');

 

// Получение параметра 'newsletter' из массива COOKIE, фильтруя как булево значение
$newsletter = cot_import('newsletter', 'COOKIE', 'BOL');


Примечания:
Функция cot_import обрабатывает различные источники данных (например, из GET, POST, COOKIE) и обеспечивает защиту от атак, таких как XSS, путем применения фильтров.
Пользователи могут добавлять свои собственные фильтры в массив $cot_import_filters, что позволяет настраивать поведение функции под специфические нужды приложения.

6 минут чтения Administrator

Комментарии (0)

Комментарии отсутствуют
Добавление комментариев доступно только зарегистрированным пользователям

Автор контента

Administrator

Оффлайн

Administrator

Последняя авторизация: 05.07.2026 18:32

  • Страница размещена: 21.01.2025 11:43
  • Последнее обновление: 21.01.2025 11:51

Похожие страницы

Функция cot_import() в Cotonti CMF
1 Функция cot_import() в Cotonti CMF Функция cot_import() предназначена для безопасного получения входных данных из