Функция cot_url_sanitize в Cotonti
предназначена для очистки URL от возможных уязвимостей, включая XSS (межсайтовое выполнение скриптов), путем кодирования опасных символов в части URL, таких как путь, параметры запроса и якорь.
Функция cot_url_sanitize предназначена для очистки URL от возможных уязвимостей, включая XSS (межсайтовое выполнение скриптов), путем кодирования опасных символов в части URL, таких как путь, параметры запроса и якорь.
Код функции:
function cot_url_sanitize($url)
{
// Определение функции фильтрации, если она не существует
if (!function_exists('urlfilter')) {
function urlfilter($str)
{
if (!$str) {
return '';
}
return rawurlencode(rawurldecode($str)); // Кодирует URL
}
}
$urlp = cot_parse_url($url); // Парсим URL на части
if (empty($urlp)) {
$urlp = []; // Если не удалось распарсить, создаем пустой массив
}
// Фильтруем фрагмент (якорь) URL
$urlp['fragment'] = !empty($urlp['fragment']) ? urlfilter($urlp['fragment']) : '';
// Фильтрация пути
$path = isset($urlp['path']) ? $urlp['path'] : '';
$query = !empty($urlp['query']) ? str_replace('&', '&', $urlp['query']) : ''; // Заменяем & на &
// Разделение пути по слэшу и фильтрация каждого сегмента
$path = explode('/', $path);
if (!empty($path)) {
$path = array_map('urlfilter', $path); // Применяем urlfilter ко всем сегментам пути
}
$urlp['path'] = implode('/', $path); // Собираем путь обратно
// Фильтрация параметров запроса
$filtered_params = [];
foreach (explode('&', $query) as $item) {
if (!empty($item)) {
if (mb_stripos($item, '=') !== false) { // Если это параметр запроса с ключом и значением
list($key, $val) = explode('=', $item, 2);
$filtered_params[] = urlfilter($key) . '=' . urlfilter($val); // Фильтруем ключ и значение
} else {
$filtered_params[] = urlfilter($item); // Если это параметр без значения, фильтруем только ключ
}
}
}
// Собираем обратно параметры запроса
if (sizeof($filtered_params)) {
$urlp['query'] = implode('&', $filtered_params);
}
return cot_http_build_url($urlp); // Возвращаем очищенный URL
}
Объяснение:
Определение функции urlfilter:
Если функция urlfilter не существует, она создается внутри основной функции. Эта функция кодирует URL, сначала декодируя его с помощью rawurldecode, а затем повторно кодируя через rawurlencode:
function urlfilter($str)
{
if (!$str) {
return '';
}
return rawurlencode(rawurldecode($str));
}
Парсинг URL:
URL разбивается на части с использованием функции cot_parse_url. Если парсинг не удается, создается пустой массив:
$urlp = cot_parse_url($url);
if (empty($urlp)) {
$urlp = [];
}
Фильтрация фрагмента (якоря):
Если в URL есть фрагмент (часть после #), он очищается с помощью urlfilter:
$urlp['fragment'] = !empty($urlp['fragment']) ? urlfilter($urlp['fragment']) : '';
Фильтрация пути:
Путь (часть URL перед параметрами запроса) разбивается на сегменты с помощью explode(), затем каждый сегмент фильтруется:
$path = explode('/', $path);
if (!empty($path)) {
$path = array_map('urlfilter', $path);
}
$urlp['path'] = implode('/', $path);
Фильтрация параметров запроса:
Параметры запроса разделяются по символу &, затем каждый параметр фильтруется. Для каждого параметра проверяется, есть ли у него ключ и значение:
$filtered_params = [];
foreach (explode('&', $query) as $item) {
if (!empty($item)) {
if (mb_stripos($item, '=') !== false) {
list($key, $val) = explode('=', $item, 2);
$filtered_params[] = urlfilter($key) . '=' . urlfilter($val);
} else {
$filtered_params[] = urlfilter($item);
}
}
}
Сборка и возврат очищенного URL:
Все части URL (путь, параметры запроса и фрагмент) собираются обратно в строку с помощью функции cot_http_build_url, которая и возвращает очищенный URL:
return cot_http_build_url($urlp);
Пример использования:
// Исходный URL
$raw_url = "http://example.com/path/to/page?param1=value1¶m2=<script>alert('xss');</script>#anchor";
// Очистка URL от XSS-уязвимостей
$sanitized_url = cot_url_sanitize($raw_url);
echo $sanitized_url;
Результат:
http://example.com/path/to/page?param1=value1¶m2=%3Cscript%3Ealert%28%27xss%27%29%3B%3C%2Fscript%3E#anchor
Здесь кодирует не только потенциально опасные параметры запроса, но и фрагмент (якорь), чтобы избежать выполнения вредоносного кода на стороне клиента.
Комментарии (0)
Автор контента
Оффлайн
Administrator
Последняя авторизация: 05.07.2026 18:32
- Страница размещена: 23.01.2025 23:31
- Последнее обновление: 23.01.2025 23:31