Как с помощью регулярных выражений очистить конфигурацию 1С от захардкоженных логинов и паролей?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

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

Поиск захардкоженных логинов и email-адресов

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

Рассмотрим пример универсального регулярного выражения для поиска email, которое учитывает различные структуры доменных имен:


(?:(?:\r\n)?[ \t])*(?:(?:(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t]
)+|\Z|(?=[\["()<>@,;:\\".\[\]]))|"(?:[^\"\r\\]|\\.|(?:(?:\r\n)?[ \t]))*"(?:(?:
\r\n)?[ \t])*)(?:\.(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(
?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|"(?:[^\"\r\\]|\\.|(?:(?:\r\n)?[ 
\t]))*"(?:(?:\r\n)?[ \t])*))*@(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\0
31]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\
](?:(?:\r\n)?[ \t])*)(?:\.(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+
(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:
(?:\r\n)?[ \t])*))*)

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

Очистка строк соединения (Usr и Pwd)

В коде 1С при программном подключении к внешним базам данных (через COM-соединение или строки подключения к внешним источникам данных) часто используются параметры Usr и Pwd. Проанализируем паттерны, которые помогут нам найти эти данные внутри строковых переменных.

Для поиска пароля в строке соединения мы можем использовать следующее выражение:

(?i)Pwd=[^;]+

Разберем, как это работает:

  1. (?i) — флаг, делающий поиск нечувствительным к регистру (в 1С это крайне важно, так как PWD, pwd и Пароль воспринимаются компилятором одинаково).
  2. Pwd= — ищет конкретное вхождение ключевого слова.
  3. [^;]+ — находит все символы, кроме точки с запятой, идущие после знака равенства. Это позволяет выделить значение пароля до конца текущего параметра в строке подключения.

Аналогичным образом мы можем найти имена пользователей, используя паттерн (?i)Usr=[^;]+.

Поиск по ключевым словам и присваиваниям

Разработчики часто называют переменные интуитивно понятно. Мы можем воспользоваться этим, чтобы найти присваивания значений переменным, связанным с безопасностью. Проанализируем паттерн, который ищет присваивание строковых значений переменным типа "пароль", "login" или "token":

(?i)(пароль|password|pwd|usr|user|login|token)\s*=\s*".*?"

Рассмотрим элементы этого выражения:

Использование этого выражения в глобальном поиске по конфигурации (Ctrl+Shift+F) позволит быстро выявить места, где данные были жестко прописаны в коде.

Анализ специфических конструкторов и методов 1С

Пароли в 1С часто передаются в качестве аргументов в системные объекты. Выясним, как найти такие места. Например, конструктор объекта HTTPСоединение принимает пароль в качестве шестого параметра.

Мы можем использовать регулярное выражение для поиска таких вызовов:

Новый HTTPСоединение\(.*?,.*?,.*?,.*?,.*?,"(.*?)".*?\)

Также важно проверить установку свойств объектов почтовых профилей (ИнтернетПочтовыйПрофиль). Посмотрим на пример кода, который мы ищем:


Профиль = Новый ИнтернетПочтовыйПрофиль;
Профиль.Пароль = "секретный_пароль";
Профиль.Пользователь = "admin";

Для поиска таких конструкций идеально подойдет регулярное выражение: (?i)\.Пароль\s*=\s*".*?". Оно найдет все случаи обращения к свойству Пароль любого объекта в конфигурации.

Поиск сложных паролей по требованиям безопасности

Если нам необходимо найти строки, которые выглядят как сложные пароли (содержат цифры, спецсимволы и буквы разного регистра), мы можем применить паттерн, основанный на "позитивных просмотрах вперед" (lookahead). Разберем пример выражения, которое ищет строку длиной 8 символов, содержащую как минимум две заглавные буквы, две цифры и спецсимвол:


^ (?=.*[A-Z].*[A-Z])(?=.*[!@#$&*])(?=.*[0-9].*[0-9])(?=.*[a-z].*[a-z].*[a-z]).{8}$

Такой подход полезен, когда мы не знаем имени переменной, но хотим найти потенциальные "ключи" в коде. Однако будьте осторожны: это может привести к ложным срабатываниям на GUID-идентификаторах или системных именах объектов.

Практические рекомендации по очистке

Выясним наиболее безопасный алгоритм действий при очистке конфигурации:

  1. Выгрузка в файлы: Вместо поиска внутри конфигуратора 1С, выгрузите конфигурацию в файлы (Конфигурация -> Выгрузить конфигурацию в файлы).
  2. Внешние редакторы: Используйте профессиональные редакторы кода, такие как VS Code или Sublime Text. В них движки регулярных выражений работают быстрее и поддерживают многострочный поиск.
  3. Режим поиска: Сначала всегда используйте только "Поиск", чтобы проанализировать результаты. Массовая "Замена" без предварительного аудита может повредить логику программы (например, удалить текст в заголовках отчетов или сообщениях пользователю).
  4. Энтропия: Если вы ищете токены (например, AWS или Bitrix24), обращайте внимание на длинные строки с высокой энтропией (случайным набором символов). Регулярка ".{20,}" поможет найти все длинные строки в кавычках для ручного анализа.

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

← На главную