Что ищет такой Regex?
От: VladCore  
Дата: 06.03.25 21:39
Оценка:
Нашел в амазоне такое решение для T-sql кода

private static readonly Regex _sqlLiteralRegex = new Regex("(?:'([^']|'')*')|(?:(-|\\+)?\\$?\\d+(\\.\\d+)?)");

/// <summary>Sanitizes the TSQL query.</summary>
/// <param name="query">The query.</param>
/// <returns>Sanitized query string</returns>
public static string SanitizeTsqlQuery(string query) => SqlUtil._sqlLiteralRegex.Replace(query, "?");

Что именно он прячет?

Насколько я понимаю regex вначале это всё что в апострофах?
В конце — это константы чисел с не-обязательной дробной частью и опционально с плюсом или минусом, типа суммы денег?
Отредактировано 06.03.2025 21:40 VladCore . Предыдущая версия .
Re: Что ищет такой Regex?
От: Enomay Россия  
Дата: 06.03.25 21:52
Оценка: +2 -1
VC>Что именно он прячет?


Для избежания SQL-Injection.

Например, из запроса
SELECT * FROM Users WHERE Name = 'O''Brien' AND Age = 25 AND Salary = -123.45

он сделает
SELECT * FROM Users WHERE Name = ? AND Age = ? AND Salary = ?
- Слава России!
— Героям СВО Слава!
Re: Что ищет такой Regex?
От: Sharov Россия  
Дата: 06.03.25 23:30
Оценка:
Здравствуйте, VladCore, Вы писали:

VC>
VC>private static readonly Regex _sqlLiteralRegex = new Regex("(?:'([^']|'')*')|(?:(-|\\+)?\\$?\\d+(\\.\\d+)?)");
VC>/// <summary>Sanitizes the TSQL query.</summary>
VC>/// <param name="query">The query.</param>
VC>/// <returns>Sanitized query string</returns>
VC>public static string SanitizeTsqlQuery(string query) => SqlUtil._sqlLiteralRegex.Replace(query, "?");
VC>

VC>Что именно он прячет?
VC>Насколько я понимаю regex вначале это всё что в апострофах?
VC>В конце — это константы чисел с не-обязательной дробной частью и опционально с плюсом или минусом, типа суммы денег?


У какого-нибудь DeepSeek'а или YandexGPT попробуйте спросить. Народ пишет, что в регулярки они умеют неплохо.
Кодом людям нужно помогать!
Re[2]: Что ищет такой Regex?
От: amironov79  
Дата: 07.03.25 05:48
Оценка: 7 (1) +1
Здравствуйте, Sharov, Вы писали:

S>Здравствуйте, VladCore, Вы писали:


VC>>
VC>>private static readonly Regex _sqlLiteralRegex = new Regex("(?:'([^']|'')*')|(?:(-|\\+)?\\$?\\d+(\\.\\d+)?)");
VC>>/// <summary>Sanitizes the TSQL query.</summary>
VC>>/// <param name="query">The query.</param>
VC>>/// <returns>Sanitized query string</returns>
VC>>public static string SanitizeTsqlQuery(string query) => SqlUtil._sqlLiteralRegex.Replace(query, "?");
VC>>

VC>>Что именно он прячет?
VC>>Насколько я понимаю regex вначале это всё что в апострофах?
VC>>В конце — это константы чисел с не-обязательной дробной частью и опционально с плюсом или минусом, типа суммы денег?


S>У какого-нибудь DeepSeek'а или YandexGPT попробуйте спросить. Народ пишет, что в регулярки они умеют неплохо.



Кстати, GeneratedRegex также человекочитаемую документацию генерит:
○ Match with 2 alternative expressions, atomically.
    ○ Match a sequence of expressions.
        ○ Match '\''.
        ○ Loop greedily any number of times.
            ○ 1st capture group.
                ○ Match with 2 alternative expressions.
                    ○ Match any character other than '\''.
                    ○ Match the string "''".
        ○ Match '\''.
    ○ Match a sequence of expressions.
        ○ Optional (greedy).
            ○ 2nd capture group.
                ○ Match a character in the set [+-].
        ○ Match '$' atomically, optionally.
        ○ Match a Unicode digit greedily at least once.
        ○ Optional (greedy).
            ○ 3rd capture group.
                ○ Match '.'.
                ○ Match a Unicode digit atomically at least once.
Re[2]: Что ищет такой Regex?
От: · Великобритания  
Дата: 07.03.25 09:59
Оценка: -1 :)
Здравствуйте, Enomay, Вы писали:

VC>>Что именно он прячет?

E>Для избежания SQL-Injection.
Как такое позволяет избегать SQL injection? Что помешает Salary сделать -123.45 OR 1=1?
А вот зато вполне годный запрос вида "update counter = counter + 1" будет превращаться в хлам.
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Отредактировано 07.03.2025 10:01 · . Предыдущая версия .
Re[3]: Что ищет такой Regex?
От: Enomay Россия  
Дата: 07.03.25 11:00
Оценка:
Здравствуйте, ·, Вы писали:

·>Здравствуйте, Enomay, Вы писали:


VC>>>Что именно он прячет?

E>>Для избежания SQL-Injection.
·>Как такое позволяет избегать SQL injection? Что помешает Salary сделать -123.45 OR 1=1?
·>А вот зато вполне годный запрос вида "update counter = counter + 1" будет превращаться в хлам.

Прежде чем нести околесицу, разберись для начала, как это работает.
- Слава России!
— Героям СВО Слава!
Re[4]: Что ищет такой Regex?
От: · Великобритания  
Дата: 07.03.25 11:12
Оценка: -1 :)
Здравствуйте, Enomay, Вы писали:

E>>>Для избежания SQL-Injection.

E>·>Как такое позволяет избегать SQL injection? Что помешает Salary сделать -123.45 OR 1=1?
E>·>А вот зато вполне годный запрос вида "update counter = counter + 1" будет превращаться в хлам.
E>Прежде чем нести околесицу, разберись для начала, как это работает.
Поясни, если, конечно, есть что пояснять. Сомневаюсь что это хоть как-то работает.
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Отредактировано 07.03.2025 11:14 · . Предыдущая версия .
Re[5]: Что ищет такой Regex?
От: Enomay Россия  
Дата: 07.03.25 11:15
Оценка:
Здравствуйте, ·, Вы писали:

·>Здравствуйте, Enomay, Вы писали:


E>>>>Для избежания SQL-Injection.

E>>·>Как такое позволяет избегать SQL injection? Что помешает Salary сделать -123.45 OR 1=1?
E>>·>А вот зато вполне годный запрос вида "update counter = counter + 1" будет превращаться в хлам.
E>>Прежде чем нести околесицу, разберись для начала, как это работает.
·>Поясни, если, конечно, есть что пояснять. Сомневаюсь что это хоть как-то работает.

Ибо регексп там, конечно, околесица. Выражение вида ([^']|'') эквивалентно (.). Сразу видно синьор 23 летний писал с помощью чатагпт.


После этого, хоть ты и удалил, совершенно не вижу никакого смысла объяснять базовые вещи.
- Слава России!
— Героям СВО Слава!
Re[6]: Что ищет такой Regex?
От: · Великобритания  
Дата: 07.03.25 11:23
Оценка:
Здравствуйте, Enomay, Вы писали:

E>После этого, хоть ты и удалил,

Я не заметил сразу вторую квоту.

E> совершенно не вижу никакого смысла объяснять базовые вещи.

Просвети. Для чего такой регекс может понадобится? И как он в принципе может избежать SQLi?
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[7]: Что ищет такой Regex?
От: m2user  
Дата: 07.03.25 12:36
Оценка: +2
E>> совершенно не вижу никакого смысла объяснять базовые вещи.
·>Просвети. Для чего такой регекс может понадобится? И как он в принципе может избежать SQLi?

Может быть цель этой замены, не защита от инъекции, а скрытие параметров запроса (строки и числа, например чтобы не писать приватные данные в логи).
Мы же не знаем какого рода этот santize.
Re[2]: Что ищет такой Regex?
От: Sinclair Россия https://github.com/evilguest/
Дата: 07.03.25 13:30
Оценка: +1
Здравствуйте, Enomay, Вы писали:

E>Для избежания SQL-Injection.

Избегать иньекций такое не особо поможет.

E>Например, из запроса

E>
E>SELECT * FROM Users WHERE Name = 'O''Brien' AND Age = 25 AND Salary = -123.45
E>

E>он сделает
E>
E>SELECT * FROM Users WHERE Name = ? AND Age = ? AND Salary = ?
E>


А вот тут вы правы. Регекс просто ищет строковые и десятичные литералы; код — заменяет их все на ?.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[8]: Что ищет такой Regex?
От: · Великобритания  
Дата: 07.03.25 13:41
Оценка:
Здравствуйте, m2user, Вы писали:

E>>> совершенно не вижу никакого смысла объяснять базовые вещи.

M>·>Просвети. Для чего такой регекс может понадобится? И как он в принципе может избежать SQLi?
M>Может быть цель этой замены, не защита от инъекции,
Именно, в лучшем случае может быть такое, и то сомнительно. Но а я сагрился на заявление (уже с двумя плюсами!), что это "Для избежания SQL-Injection". Не может быть такого.

M> а скрытие параметров запроса (строки и числа, например чтобы не писать приватные данные в логи).

А откуда в коде без sqli в тексте запроса появятся параметры запроса в виде чисел или строк? Изначально там должны стоять ?.

M>Мы же не знаем какого рода этот santize.

А мне очень интересно узнать.
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[3]: Что ищет такой Regex?
От: Khimik  
Дата: 23.03.25 15:17
Оценка:
Здравствуйте, Sinclair, Вы писали:

S>А вот тут вы правы. Регекс просто ищет строковые и десятичные литералы; код — заменяет их все на ?.


Синклер, извините за нелепый оффтоп, вы не можете написать мне на почту nickolay5544[одомашненный волк]gmail.com?
"Ты должен сделать добро из зла, потому что его больше не из чего сделать." Р.П. Уоррен
Re[9]: Что ищет такой Regex?
От: VladD2 Российская Империя www.nemerle.org
Дата: 10.06.25 23:10
Оценка:
Здравствуйте, ·, Вы писали:

·>А откуда в коде без sqli в тексте запроса появятся параметры запроса в виде чисел или строк? Изначально там должны стоять ?.


Наверно у этого кода есть продолжение, где этим же регекспом выбираются значения и подставляются в качестве параметров. Не даром они все в группы (скобки) взяты.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.