При передаче конфигурации 1С сторонним разработчикам или заказчикам одной из критически важных задач является очистка кода от захардкоженных учетных данных. Забытые логины, пароли от почтовых ящиков, API-ключи и токены авторизации могут стать серьезной брешью в безопасности компании. В этой статье мы рассмотрим, как эффективно использовать механизмы регулярных выражений (RegEx) для автоматизированного поиска и удаления конфиденциальной информации из модулей 1С.
Часто в качестве логинов в коде 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С мы чаще сталкиваемся с простыми строковыми литералами. Разберем более прикладной подход для поиска строк соединения.
В коде 1С при программном подключении к внешним базам данных (через COM-соединение или строки подключения к внешним источникам данных) часто используются параметры Usr и Pwd. Проанализируем паттерны, которые помогут нам найти эти данные внутри строковых переменных.
Для поиска пароля в строке соединения мы можем использовать следующее выражение:
(?i)Pwd=[^;]+
Разберем, как это работает:
PWD, pwd и Пароль воспринимаются компилятором одинаково).Аналогичным образом мы можем найти имена пользователей, используя паттерн (?i)Usr=[^;]+.
Разработчики часто называют переменные интуитивно понятно. Мы можем воспользоваться этим, чтобы найти присваивания значений переменным, связанным с безопасностью. Проанализируем паттерн, который ищет присваивание строковых значений переменным типа "пароль", "login" или "token":
(?i)(пароль|password|pwd|usr|user|login|token)\s*=\s*".*?"
Рассмотрим элементы этого выражения:
Использование этого выражения в глобальном поиске по конфигурации (Ctrl+Shift+F) позволит быстро выявить места, где данные были жестко прописаны в коде.
Пароли в 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-идентификаторах или системных именах объектов.
Выясним наиболее безопасный алгоритм действий при очистке конфигурации:
".{20,}" поможет найти все длинные строки в кавычках для ручного анализа.Таким образом, комбинируя стандартные паттерны для email и паролей со знанием синтаксиса встроенного языка 1С, мы можем обеспечить надежную очистку программного продукта перед его передачей, минимизируя риски утечки данных.