Права и безопасность
Кто что может
Доступ к экранам модуля определяется правом на модуль «mrLexndr Мультиязычность» в Настройки → Доступ к модулю.
| Право | Что даёт |
|---|---|
W | всё: настройки, перевод, удаление фраз |
R | смотреть экраны, но не менять |
D | запрет, включая чтение |
| не задано | наследуется право на главный модуль |
Последняя строка — не мелочь. Если право на модуль не выставлено вовсе, работает право на главный модуль: у кого есть доступ к настройкам Битрикса, у того есть и доступ сюда.
А вот явное R на модуле блокирует запись, даже если на главный модуль есть W. Явная настройка сильнее унаследованной.
Что выдаётся при установке
Администраторским группам выставляется W. Это делается однократно и помечается в настройках, чтобы повторная установка не перевыдавала права заново.
Выданные вручную права не трогаются. Досев идёт только тем группам, у которых доступа не было, — иначе установка модуля отменяла бы решения администратора.
Отдельно стоит знать про вкладку «Где используется» на карточке записи словаря: она тоже спрашивает право на модуль, хотя висит на форме ядра. Без этого запрет на модуль её не закрывал, а по ссылке «искать сейчас» запускался обход всего сайта со списком путей файлов проекта в ответе.
Поиск фраз на экране Файловые фразы требует того же права W, что импорт и удаление фраз. Смотреть отчёты можно с правом на чтение. Запуск прогона меняет словарь и поведение GetMessage() на витрине.
Второе такое место — SEO-переводы в карточке элемента. Обычное зеркало полей открывается по праву на чтение, а сохранение SEO-шаблона требует права W: шаблон уезжает в мета-теги публичных страниц, то есть меняет содержимое сайта. Раньше хватало чтения, и осознанно выставленное R здесь не работало. Отказ пишется в журнал, тип TRANSLATE_LANG_MIRROR_SEO_DENIED.
Защита действий
Все действия, которые что-то меняют, идут только методом POST, проверяют токен сессии Битрикса и право на запись. Запросы GET для них отключены: ссылка, которая что-то меняет, однажды окажется в чужом письме.
Что уходит наружу при ошибке
На непредвиденную ошибку эндпоинт перевода отвечает общей фразой, а не текстом исключения. Подробности идут в журнал событий, тип TRANSLATE_ENDPOINT_FAILURE, и в ответе сказано, где их смотреть.
Причина: в такой текст попадают адрес сервиса на сетевых сбоях, пути файлов и куски SQL. Правило действовало внутри обработчика давно, но внешний перехват дописывал текст в ответ целиком — а подключение модуля стоит там до любой проверки, так что на сломанной установке путь файла мог получить анонимный запрос.
Для разбора это ничего не усложняет: всё, что раньше было в ответе, лежит в журнале, и там же видно, какой запрос его вызвал.
Экранирование
Пользовательские данные выводятся в разметку через штатное экранирование Битрикса. Адреса в обработчиках режима правки экранируются отдельно, как строки JavaScript.
Защита от формул в таблицах
Каждая ячейка выгрузки проверяется: если значение начинается с =, +, -, @ или пробельного символа, к нему добавляется апостроф.
Без этого фраза вроде «-15% на всё» открывается в Excel как формула. В лучшем случае это ошибка вычисления, в худшем — исполняемое выражение на чужой машине.
Импорт принимает только колонку кода и языковые колонки. Любая другая в заголовке останавливает загрузку: файл с лишними колонками — это почти всегда не тот файл.
Сеть
Проверка сертификата включена во всех клиентах.
Ключей провайдеров перевода в модуле нет вообще. Авторизация идёт по хешу лицензии Битрикса; ключи Яндекса и Google живут на стороне сервиса. Украсть из настроек модуля нечего.
Адрес сервиса ограничен списком хостов модуля. Отладочная настройка адреса принимает не любой https-адрес: хост обязан быть в списке, и его адрес проверяется на приватные и служебные диапазоны. По этому адресу уходит ключ лицензии, и произвольный хост в настройке означал бы, что его можно увести настройкой сайта. Стенд добавляется правкой поставки, а не настройкой.
Текст сетевого сбоя не называет ни адрес, ни подробности транспорта. Вместе они отвечали на вопрос «доступен ли такой-то хост с этого сервера». Подробности идут в журнал, тип TRANSLATE_SAAS_NETWORK.
Повторы запросов выполняются только для статусов, при которых запрос заведомо не дошёл до платной работы, либо когда у запроса есть ключ идемпотентности. См. Сеть, таймауты и повторы.
Консольные скрипты
Служебные скрипты модуля работают только из консоли: первая исполняемая строка — проверка способа запуска, веб-запрос получает 404. В поставку Маркетплейса они не входят вовсе.
Два слоя здесь намеренно: проверка работает всегда, а отсутствие файла не может отказать.