Функция 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&param2=<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&param2=%3Cscript%3Ealert%28%27xss%27%29%3B%3C%2Fscript%3E#anchor

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

3 minutes read Administrator

Comments (0)

No comments yet
Only registered users can post new comments

Content author

Administrator

Offline

Administrator

Last logged: 2026-07-21 00:03

  • Page published: 2025-01-23 23:31
  • Last update: 2025-01-23 23:31