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

Как обрабатывать GET -запрос по маске (процедурному выражению)

08.04.2022, 15:01. Показов 1121. Ответов 19

Студворк — интернет-сервис помощи студентам
Здравствуйте! Мне необходимо написать код, который бы сначала фильтровал то, что пользователь хочет отправить через форму (метод GET), а потом уже добавлял полученное в url.
Нужно это для того, чтобы пользователи не могли проводить любого рода инъекции как через взаимодействие с адресной строкой, так и при отправке чего-либо через инпуты.
Думаю, маска типа '<.*>' вполне подойдёт, но как её применить не очень понимаю...
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
08.04.2022, 15:01
Ответы с готовыми решениями:

Как обрабатывать запрос по отдельному адресу?
Я уверен, что в ASP.NET есть такая функция, иначе он просто не был бы настолько популярен. Я пока что не знаю, зачем именно мне это...

Как заставить mongo быстрее обрабатывать запрос?
Имеется база MongoDB 3.2.0, в ней более миллиарда записей. Необходимо выполнить создание нового поля путем арифм. операций над...

Сложный запрос по выражению
Мне нужно сделать сложный запрос по выражению where, SQL-bilder у меня не работает, поэтому нужно сделать это через строку запроса,...

19
168 / 124 / 42
Регистрация: 25.10.2019
Сообщений: 476
08.04.2022, 15:13
регулярные выражения
0
0 / 0 / 0
Регистрация: 06.04.2022
Сообщений: 15
08.04.2022, 16:13  [ТС]
websyst_ru, да, прошу прощения, именно их я и имел в виду
0
168 / 124 / 42
Регистрация: 25.10.2019
Сообщений: 476
08.04.2022, 16:25
Николай4ик, Значит пользуйтесь, эта статья поможет вам составить паттерн.

А убрать последовательность, согласно вашему паттерну, можно с помощью функции

PHP
1
str_replace("%body%", "black", "<body text='%body%'>");
Работает по принципу, что? - чем? - где? = что заменить - чем заменить - где заменить.

PHP
1
str_replace("[ваша регулярка]", "", "ваш Get-запрос(параметр)";
Второй параметр оставляете пустой, т.к. вам надо вырезать/убрать данные, а не заменить.
1
0 / 0 / 0
Регистрация: 06.04.2022
Сообщений: 15
08.04.2022, 16:38  [ТС]
websyst_ru, спасибку я оставил, но именно так у меня сейчас и работает, но в url лезет невесть что, всё равно.

PHP
1
$codinator = preg_replace('#&lt;.*&gt;#u', '', $codinator);
а на выходе получаю что-то такое:

http://localhost/dashboard/tryer/123.php?name=%3Cscript%3Ealert%28%22nope%22%29%3C%2Fs cript%3E123

При чём ввожу я <script>alert("nope")</script>123

А если ещё и сделаю echo этой переменной, то получу просто 123 на выходе

Добавлено через 1 минуту
websyst_ru, я использовал FILTER_SANITIZE_FULL_SPECIAL_CHARS, поэтому такая регулярка

Добавлено через 2 минуты
websyst_ru, а когда ваш str_replace, вместо своего preg_replace подставил, так вообще теперь нигде ничего не откидывается
0
168 / 124 / 42
Регистрация: 25.10.2019
Сообщений: 476
08.04.2022, 16:43
это юникод, это нормальная реакция на текст в браузерной строке.
Совсем не понятно, зачем это всё изобретается и почему через get вы отправляете js.

в гет-запросе нужно отбрасывать всё, что не является параметром или "значением=параметром".

А вообще
PHP
1
2
3
4
$str = $_GET['параметр'];
$str = trim($str);
$str = stripslashes($str);
$str = htmlspecialchars($str);
А еще, правильно формировать запрос, а не кашу, поможет
PHP
1
 http_build_query($data);
0
0 / 0 / 0
Регистрация: 06.04.2022
Сообщений: 15
08.04.2022, 16:45  [ТС]
websyst_ru, скрипт я передавал через инпут, дабы проверить сработает ли он
0
168 / 124 / 42
Регистрация: 25.10.2019
Сообщений: 476
08.04.2022, 17:00
Николай4ик,
а не проще разрешить только то, что можно, а не пилить под всевозможные варианты?

PHP
1
$url = preg_replace('#[^a-z0-9_=&]#', '', $url);
0
 Аватар для crautcher
2450 / 2301 / 597
Регистрация: 27.05.2011
Сообщений: 7,845
08.04.2022, 18:08
Цитата Сообщение от Николай4ик Посмотреть сообщение
написать код, который бы сначала фильтровал то, что пользователь хочет отправить через форму (метод GET), а потом уже добавлял полученное в url.
Сначала фильтровать? Что ему помешает самому в адрес вбить инъекции, без твоей формы? Браузерная строка редактируется. Филтьровать нужно при обработке, после отправки, а не до отправки.
0
Надуваю лягушек
Эксперт PHP
 Аватар для Царь Бабай
289 / 219 / 93
Регистрация: 01.05.2014
Сообщений: 742
09.04.2022, 06:09
Может так?

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
function quote_html($document)
{
$search = ["'<script[^>]*?>.*?</script>'si",  // Вырезается javascript
       "'<[\/\!]*?[^<>]*?>'si", // Вырезаются html-тэги
       "'([\r\n])[\s]+'",       // Вырезается пустое пространство
       "'&(quot|#34);'i",       // Замещаются html-элементы
       "'&(lt|#60);'i",
       "'&(gt|#62);'i",
       "'&(nbsp|#160);'i",
       "'&(iexcl|#161);'i",
       "'&(cent|#162);'i",
       "'&(pound|#163);'i",
       "'&(copy|#169);'i",
       "'&#(\d+);'e"];// вычисляется как php
$replace = ["",
        "",
        "\\1",
        "\"",
        "<",
        ">",
        " ",
        chr(161),
        chr(162),
        chr(163),
        chr(169),
        "chr(\\1)"];
$document = str_replace($search, $replace, $document);
return $document;
}
Добавлено через 17 минут
или так?
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$otvet = mb_strtolower($_SERVER['REQUEST_URI']);
if (strpos($otvet, "eval") ||
    strpos($otvet, "alert") ||
    strpos($otvet, "%") ||
    //strpos($otvet, "<") ||
    strpos($otvet, "/") ||
    strpos($otvet, "alert") ||
    strpos($otvet, "concat") ||
    strpos($otvet, "select") ||
    strpos($otvet, "+") ||
    strpos($otvet, "union") ||
    strpos($otvet, "base64")) {
header("HTTP/1.1 301 Moved Permanently");
header("Location: /");
exit();
}
0
0 / 0 / 0
Регистрация: 06.04.2022
Сообщений: 15
11.04.2022, 11:01  [ТС]
Царь Бабай, а как Ваш первый вариант в код вставлять?
Вот, допустим, ест такая форма:
HTML5
1
2
3
4
5
6
<form method="get">
    <input type="text" name="someinput1">
    <input type="text" name="someinput2">
 
    <input type="submit" value="ok">
</form>
Как интегрировать?
0
1 / 1 / 0
Регистрация: 10.04.2022
Сообщений: 33
11.04.2022, 11:15
Обработка строк ПЕРЕД ВЫВОДОМ

и не занимайся ерундой
0
1 / 1 / 0
Регистрация: 10.04.2022
Сообщений: 33
11.04.2022, 11:27
Николай4ик, я тебе уже всё давал, но ты настойчиво лезешь в регулярки

в адресной строке - /?a=<script>alert('Я XSS-скрипт, но я не выполнился')</script>

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
function clearVars($source)
{
    if (is_array($source)) {
        foreach ($source as $key => $value) {
            $source[$key] = clearVars($value);
        }
 
        return $source;
    }
 
    if (is_object($source)) {
        foreach ($source as $property => $value) {
            $source->{$property} = clearVars($value);
        }
 
        return $source;
    }
 
    return is_string($source) ? htmlspecialchars($source, ENT_QUOTES) : $source;
}
 
extract(clearVars($_GET));
 
echo $a;
результат
Миниатюры
Как обрабатывать GET -запрос по маске (процедурному выражению)  
0
0 / 0 / 0
Регистрация: 06.04.2022
Сообщений: 15
11.04.2022, 12:42  [ТС]
Debian, проблема в том, что при переходе по такой ссылке
http://localhost/exmple.php?%3... /script%3E
Скрипт спокойно выполняется, а значит пассивная атака возможна

Добавлено через 8 минут
Да и если я поменяю name инпута через F12<script>alert('Я XSS-скрипт, но я не выполнился')</script>
То всё сработает
0
1 / 1 / 0
Регистрация: 10.04.2022
Сообщений: 33
11.04.2022, 14:38
Добавлено через 19 секунд
Николай4ик, бред
1
168 / 124 / 42
Регистрация: 25.10.2019
Сообщений: 476
12.04.2022, 14:02
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
function getParams(array $fields): string
{
    foreach ($fields as $field) {
        if ($_REQUEST[$field]) {
            $urlParam = preg_replace('#[^a-z0-9_-]#', '', $_REQUEST[$field]);
            $params[$field] = $urlParam;
            $query = http_build_query($params);
        }
    }
    return $query;
 
}
 
$fields = array('name', 'phone');
echo getParams($fields);
0
26 / 21 / 7
Регистрация: 23.03.2022
Сообщений: 87
13.04.2022, 16:05
Цитата Сообщение от websyst_ru Посмотреть сообщение
$query = http_build_query($params);
А зачем оно там ?
0
168 / 124 / 42
Регистрация: 25.10.2019
Сообщений: 476
13.04.2022, 23:57
firatov, чтобы собрать валидный get.

Функция сверяет допустимые параметры (казалось бы, зачем in_array =), тем самым любой гет-запрос сделать не получится.Только то, что разрешено
затем убирает всё, что не может входить в запрос. Оставляет только цифры, буквы и два знака "-" и "_".
Затем из оставшихся данных собирает валидный запрос http_build_query и вуа-ля, на выходе получаем то,что поймет и браузер и то,что нужно на странице по задумке автора
0
26 / 21 / 7
Регистрация: 23.03.2022
Сообщений: 87
14.04.2022, 01:24
Цитата Сообщение от websyst_ru Посмотреть сообщение
чтобы собрать валидный get.
У тебя при каждом foreach перезаписывается переменная $query.

По этому я и спросил, зачем нужен этот вызов в цикле ?
0
168 / 124 / 42
Регистрация: 25.10.2019
Сообщений: 476
14.04.2022, 02:20
Но а так, да. Можно и вынести за пару скобочек)
Изображения
 
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
14.04.2022, 02:20
Помогаю со студенческими работами здесь

Если переменная из GET содержит определённое значение - не обрабатывать запрос.
Добрый день(ночь), возникла такая проблема. Нужно чтобы определённые запросы поступающие в add.php фильтровались. Код add.php: Код...

Php не хочет обрабатывать запрос POST через AJAX
let nameObj = { name:&quot;Vova&quot; }; function sendToPhp(url,method) { let http = new XMLHttpRequest(); ...

Запрос по маске
Привет. Mysql. В базе есть таблицы имеющие в названии одинаковую первую часть. Например prefix_office_one, prefix_office_tow. Как мне...

Запрос по маске
procedure TForm7.Button3Click(Sender: TObject); begin ADOQuery2.SQL.Clear; ADOQuery2.SQL.Add('SELECT Count(KE) FROM IPaddress5 WHERE...

LINQ запрос на совпадение по маске
Друзья, задача заключается в следующем. Имею метод, который проверяет строку на схожесть по маске, с помощью рег.выражения. private...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru