TGViewer
Александр Кунташов — про 1С и не только Александр Кунташов — про 1С и не только @kuntashov_devnotes · 2.56K subscribers
Post #219 775
💉 1С+Postgres и SQL-injection

У вас ПОДОБНый код не вызывает никаких вопросов?

Запрос = Новый Запрос("
|ВЫБРАТЬ
| Т.Поле1
|ИЗ
| Таблица КАК Т
|ГДЕ
| Т.Поле2 ПОДОБНО """ + СтрокаПоиска + """
|
|");

Вы молодец, если задумались о значении в СтрокаПоиска: откуда оно к нам пришло и можем ли мы ему доверять?

Генерация текста запроса налету в зависимости от каких-то внешних условий - распространенный прием при работе с БД. Он кроме всего прочего хорошо известен как потенциальня дыра в безопасности, эксплуатируемая при помощи атак типа SQL-injection. Защита от таких атак сводится к элементарным правилам гигиены: все входящие внешние данные, используемые при "сборке" итогового запроса нужно проверять и экранировать.

В 1С прием "сборки" запросов по частям тоже очень популярен, но заниматься "гигиеной" входящих данных не принято. Отчасти это оправдано тем, что в языке запросов 1С отсутствует возможность модификации данных, отчасти - из-за того, что взаимодействие учетной системы с внешним миром чаще ограничено и всем входящим данным принято по умолчанию доверять.

Тем не менее мне однажды подвернулся случай, когда запрос аналогичный запросу выше, приводил к падению рабочего процесса 1С и это было неприятно.

В старом битриксовом модуле обмена с сайтом 6.0.x есть запрос с ПОДОБНО. В качестве аргумента этой конструкции передавалась строчка — комментарий вида [Номер документа: B2B-XXXXXX], приходящая из Битрикса, где XXXXXX — случайный набор латинских символов. В подавляющем большинстве случаев все было ОК, но время от времени рабочий процесс падал во время выполнения обмена.

Совершенно случайно заметили, что ошибка стабильно воспроизводится когда XXXXXX начинался с символа A. Квадратные скобки [], как мы знаем, служат для обозначения множества символов, например, "любой символ латинского алфавита" можно записать как [A-Z]. Так вот, когда в качестве аргумента ПОДОБНО передается конструкция, в которой левая граница диапазона больше правой, например, [...B-A...], 1С падает с исключением - прямо как на скриншоте ниже.

Решение очевидное: экранировать спецсимволы: ... ПОДОБНО "\[B-A\]" СПЕЦСИМВОЛ "\" ....

Ошибка воспроизводится в клиент-серверной версии 1С, когда в качестве СУБД используется PostgreSQL. В файловой версии 1С такой запрос исключения не вызовет, и результата ожидаемо не вернет. Воспроизведение ошибки на других СУБД не проверял.

#1С
More from @kuntashov_devnotes
  1. Sep 28, 2026Что с кожаными сотрудниками, что с цифровыми вопрос "А не фигню ли мы делаем?" остается ак…
  2. Sep 10, 2026Post #749
  3. Aug 28, 2026✍️ Humanizer для русского языка от Сарычевой Внезапно на пост про grilling получил много о…
  4. Aug 17, 2026Может ли AI написать автотест для 1С: демонстрация Vanessa Automation Vanessa Automation –…
  5. Aug 13, 2026🔥 grill-me: как «прожарить» идею или требование при помощи ИИ до начала разработки Вижу,…
  6. Jun 22, 2026🎙 Продолжаем знакомить вас с модераторами INFOSTART TECH EVENT 2026 и их докладами Алекса…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →