Форум программистов, компьютерный форум, киберфорум
PHP для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Заблокирован

Фильтр url, допустимых get

22.12.2024, 00:07. Показов 307. Ответов 1
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
Берем строчку get, получаем из нее массив
mb_parse_str($url['query'], $g); 
 
#Задаем список допустимых get параметров
$fl =  ['time','type'];
 
#Перебираем массив в цикле
foreach($g as $k => $v) 
{
    #Если ключ присутствует в списке, собираем в новый массив
    if(in_array($k, $fl){
 
        #time - может быть только числом, проверяем
        if($k == 'time' && (int)$v)
            $result[] = $k.'='.$v;
 
        #type - может принимать 2 параметра top/cena
        if($k == 'type' && in_array($v, ['top', 'cena']))
            $result[] = $k.'='.$v;
 
    }
}
    
//Создаем свежий url
$new_url = "/news".($result ? "?".implode('&', $result) : NULL);
 
//Далее сверяем текущий с новый, в случаи отличия, перенаправляем на свежий. Бывает просто на конце ?
if($_SERVER['REQUEST_URI'] != $new_url)
    print_r($new_url);
В попытке исключить левый url, написал код выше. Работает, но слишком заморочено, при том, что не для одного католога необходимо писать.

Может подскажите, есть другие варианты, проще, надежнее?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
22.12.2024, 00:07
Ответы с готовыми решениями:

Как поставить фильтр, чтобы можно было добавить url только одного домена?
Всем привет! Есть код, который добавляет ссылки в текстовый файл: <html> <meta charset="utf-8"> <form...

URL-фильтр
Необходимо на win7 закрыть доступ к развлекательным сайтам. Сервера нет. Фильтры в роутере недоступны. Изложение проблемы : Рассмотрим...

URL фильтр не работает
Добрый день уважаемый или уважаемая. Почему не фильтриует?

1
Нарушитель
110 / 86 / 32
Регистрация: 10.05.2023
Сообщений: 323
22.12.2024, 00:44
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
<?php
 
class UrlFilter {
    private array $allowedParams;
    private string $normalizedPath = '/';
    private const ALLOWED_RULE_TYPES = ['int', 'enum'];
 
    public function __construct(array $params = null) {
        $this->allowedParams = $params ?? [
            'time' => ['type' => 'int'],
            'type' => ['type' => 'enum', 'values' => ['top', 'cena']],
        ];
        $this->validateRules($this->allowedParams);
    }
 
    public function filterUrl(string $requestUri): string {
        $urlParts = parse_url($requestUri);
        if ($urlParts === false) {
            throw new Exception("Invalid URL format: $requestUri");
        }
 
        $path = $urlParts['path'] ?? '/';
        $queryString = $urlParts['query'] ?? '';
        $this->normalizedPath = $path === '/' ? '/' : rtrim($path, '/');
 
        if (empty($queryString)) {
            return $this->normalizedPath;
        }
 
        parse_str($queryString, $params);
        $filteredParams = $this->filterParams($params);
 
        return $this->normalizedPath . ($filteredParams ? '?' . http_build_query($filteredParams) : '');
    }
 
    private function filterParams(array $params): array {
        $filtered = [];
        foreach ($params as $key => $value) {
            if (!isset($this->allowedParams[$key])) {
                error_log("Skipping unknown parameter: $key");
                continue;
            }
 
            $rule = $this->allowedParams[$key];
            if ($this->validateParam($value, $rule)) {
                $filtered[$key] = $value;
            } else {
                error_log("Invalid parameter value: $key = $value");
            }
        }
        return $filtered;
    }
 
    private function validateParam($value, array $rule): bool {
        switch ($rule['type']) {
            case 'int':
                return filter_var($value, FILTER_VALIDATE_INT) !== false;
            case 'enum':
                return in_array($value, $rule['values'], true);
            default:
                error_log("Unknown rule type: {$rule['type']}");
                return false;
        }
    }
 
    private function validateRules(array $rules): void {
        foreach ($rules as $key => $rule) {
            if (!isset($rule['type']) || !in_array($rule['type'], self::ALLOWED_RULE_TYPES, true)) {
                throw new InvalidArgumentException(
                    "Invalid rule type for parameter '$key'. Allowed types: " . implode(', ', self::ALLOWED_RULE_TYPES)
                );
            }
            if ($rule['type'] === 'enum' && (!isset($rule['values']) || !is_array($rule['values']) || empty($rule['values']))) {
                throw new InvalidArgumentException("Enum rule for parameter '$key' must specify non-empty 'values' array.");
            }
        }
    }
 
    public function getRules(): array {
        return $this->allowedParams;
    }
 
    public function getNormalizedPath(): string {
        return $this->normalizedPath;
    }
}
 
try {
    $filter = new UrlFilter();
    $newUrl = $filter->filterUrl($_SERVER['REQUEST_URI']);
 
    if ($_SERVER['REQUEST_URI'] !== $newUrl) {
        if (!headers_sent()) {
            header("Location: $newUrl", true, 301);
            exit;
        }
        error_log("Headers already sent. Redirecting to $newUrl via JavaScript.");
        echo "<script>window.location.href = '" . htmlspecialchars($newUrl, ENT_QUOTES, 'UTF-8') . "';</script>";
        exit;
    }
} catch (Exception $e) {
    error_log("URL Filter Error: " . $e->getMessage());
    http_response_code(404);
    exit;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
22.12.2024, 00:44
Помогаю со студенческими работами здесь

Фильтр на все URL
Разные всякие эксперименты с сервлетами не дали никакого результата по организации работы одного сервлета с разными URL. Ничего не...

Фильтр для URL в Telethon
Здравствуйте. Я начинающий, подскажите пожалуйста, как сделать фильтр ссылок в грабере телеграмм на telethon? То есть нужно чтобы код...

Нужен URL-фильтр для импорта на прокси?
офисные юзвери совсем оборзели, со своими однокласники и вконтакте, господа админы выручайте, скинте на почту или дайте ссылку где скачать...

Новые url на сайте попадают в индекс стабильно только по прошествии 1.5-2-х месяцев, что за фильтр?
Проблема именно состоит в следующем. Новые ссылки URL попадают в индекс только через 1.5-3 месяца (т.е. до того момента как они...

Открыть URL (там ссылка, которая совершает переход на другой URL) и вытянуть новый URL
Стоит задача по одному URL получить другой Пробовал открывать URL через webbrowser, но это не совсем то, что нужно, в идеале вообще не...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru