Функция 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 = "'.$filter.'" ?'
);
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, что позволяет настраивать поведение функции под специфические нужды приложения.
Комментарии (0)
Автор контента
Оффлайн
Administrator
Последняя авторизация: 05.07.2026 18:32
- Страница размещена: 21.01.2025 11:43
- Последнее обновление: 21.01.2025 11:51