# Безопасность логов

## Логи лежат вне корня сайта

Каталог логов — `\Shef\Problems\Main\Constants::getLogDir()`. По умолчанию он
на уровень **выше** корня сайта:

| корень сайта | каталог логов |
|---|---|
| `/home/bitrix/www` (BitrixVM) | `/home/bitrix/sh_log` |
| `/var/www/portal` | `/var/www/sh_log` |

Что в логах: трассировки с путями, сообщения исключений, контекст записей — а
в контекст попадают поля заказов, лидов, ответы внешних систем. Вне корня сайта
веб-сервер эти файлы не отдаёт, настраивать для этого ничего не нужно.

До 2.0.0 логи лежали в `/local/sh_log` — под корнем сайта, и `/local/` в
стандартной поставке BitrixVM не закрыт. Имена файлов предсказуемы
(`log.log`, `sh_problems_sale.log`), так что скачать их мог любой.

### Свой каталог

Если рядом с корнем сайта писать нельзя или логи нужны в другом месте, проект
задаёт каталог в `/bitrix/.settings_extra.php`:

```php
return [
	'shef.problems' => [
		'value' => [
			'logDir' => '/var/log/portal',
		],
		'readonly' => true,
	],
];
```

Принимается **только абсолютный путь**. Относительный зависел бы от текущего
каталога процесса: агент из cron писал бы в одно место, а страница — в другое.
Что-то кроме абсолютного пути — каталог по умолчанию.

Каталог обязан быть **вне корня сайта** — модуль это не проверяет, это решение
проекта.

### Права и open_basedir

Каталог создаётся сам при первой записи — если пользователь PHP может писать в
его родителя. На BitrixVM `/home/bitrix` принадлежит `bitrix`, всё работает из
коробки. В другом окружении создайте каталог заранее:

```bash
sudo mkdir /var/www/sh_log && sudo chown www-data: /var/www/sh_log
```

Если в PHP задан `open_basedir`, каталог логов должен в него входить — иначе
запись в файл не пройдёт. В логе PHP появятся предупреждения `open_basedir
restriction in effect` от самого Monolog и строка `shef.problems: запись
логгера … не прошла: UnexpectedValueException …`. Вызывающий код при этом не
падает — у логгеров модуля (сервисы из `.settings.php`, фабрика проблем).
`_log()` и `_log1()` пишут мимо Monolog, через `File::putFileContents()`, и
строки `shef.problems:` от них не будет.

### После обновления с 1.x

Старый каталог `/local/sh_log` модуль не трогает: в нём ваши данные. Но он
**по-прежнему открыт** веб-серверу. Перенесите нужное и удалите его:

```bash
mv /home/bitrix/www/local/sh_log/*.log /home/bitrix/sh_log/ 2>/dev/null
rm -r /home/bitrix/www/local/sh_log
```

И поправьте пути в `/etc/logrotate.d/`, если настраивали ротацию —
[пример](https://github.com/bx-shef/problems/blob/main/docs/logrotate/logrotate-b24-shef-problems).

Если проект кладёт в каталог логов `exceptions.log` (`exception_handling` в
`/bitrix/.settings.php`) или `mailer.log`, перенесите и эти пути.

## Логи смотреть через админку

Раз каталог вне корня сайта, ни прямая ссылка, ни файловый менеджер Битрикса до
него не дотянутся. Смотреть логи — страницей модуля
`/bitrix/admin/shef_problems_logs.php` (**Настройки → Учёт проблем → Логи**):

* только администратору;
* имя файла из запроса проверяется дважды — по шаблону (буквы, цифры, `_`,
  `-`, расширение `.log`, номер ротации) и после разрешения пути: файл обязан
  лежать внутри каталога логов, символическая ссылка наружу отсекается;
* показывается конец файла, не больше 256 КБ;
* содержимое экранируется.

Держит это `\Shef\Problems\Main\LogFiles`, сторожит `tests/logfiles_test.php`.

## Вывод на экран экранируется

`_pr()`, `PrHandler` и `PrHtmlHandler` печатают запись прямо в страницу. Всё,
что пришло из записи, экранируется: в сообщение и контекст попадает в том числе
ввод посетителя, а смотрит на вывод администратор — непроэкранированный вывод
был бы хранимым XSS в его браузере. До 2.0.0 так и было.

Показывать вывод всем (`isShowForAll: true`) — только на стенде: там может
оказаться что угодно из контекста.

## Ключи и токены — не в код

Обработчики с ключами (Telegram, Slack, почта) настраиваются в
`/bitrix/.settings_extra.php`, который не уезжает в репозиторий проекта, — см.
[Monolog](/modules/problems/monolog).

[← Ротация логов](/modules/problems/logrotate) | [↑ Содержание](/modules/problems)

::note
Источник: [problems/docs/security.md](https://github.com/bx-shef/problems/blob/main/docs/security.md) — правки туда, сайт пересобирается сам.
::
