# Безопасность выполнения и обработки запросов

В разделе описаны меры безопасности, применяемые при выполнении серверной логики, обработке пользовательского ввода и работе HTTP-интерфейсов системы.

## Безопасность выполнения серверной логики

В системе реализованы ограничения, направленные на безопасное выполнение серверной логики, включая выполнение выражений и сценариев.

- ограничен доступ к SOAP-сервису, используемому для работы с шаблонами;
- шедуллер запускается под разными пользователями; настройка разграничения пользователей для шедуллера не применяется;
- вызов JEXL-выражений через SSH-консоль выполняется с использованием безопасного диалекта;
- реализовано разграничение прав на выполнение JEXL-скриптов через веб-сокеты.

## Защита от изменения логики SQL-запросов

В системе реализован комплекс мер, направленных на предотвращение изменения логики SQL-запросов за счёт пользовательских данных. Эти меры обеспечивают защиту от SQL-инъекций и исключают возможность выполнения несанкционированных операций с базой данных.

| Реализованные меры | Описание реализации |
|--------------------|---------------------|
| Экранирование пользовательского ввода | Реализована функция `sqlEscape` для экранирования пользовательских данных. Использование функции обязательно при формировании SQL-запросов путём конкатенации строк и закреплено организационно в требованиях к разработке. |
| Безопасное построение динамических SQL-запросов | Реализован компонент `SqlBuilder` для формирования динамических SQL-запросов. Компонент автоматически выполняет экранирование пользовательских данных, если явно не указано иное. |
| Ограничение доступа к SQL-логике через JEXL | Реализован доступ к пакетам базы данных через JEXL с возможностью ограничения доступа ко всему пакету или к отдельным методам. Пакеты не отображаются в списке объектов администратора. |
| Разграничение доступа в REST-пакетах | Реализована возможность разграничения доступа в REST-пакетах на уровне URL входящих запросов. |

Указанные меры применяются во всех компонентах системы, где пользовательские данные участвуют в формировании SQL-запросов, включая REST-интерфейсы и серверную логику.

**Пример обработки запроса**

```pgsql
GET /GLOBAL-QAS/gtk-ru.bitec.app.btk.utils.Btk_UrlObjectFinder%23UrlFinder/?ex;sTableName_dz=btk_user;SELECT+version()::int%3d1;+--+-&ex;susername=UIB_SCAN2 HTTP/1.1
Host: global-qas.sgc.oil.gas
Cookie: access_token=<JWT>
```

В результате обработки запроса SQL-инъекция нейтрализуется за счёт экранирования пользовательского ввода и безопасного формирования SQL-запроса. Выполнение внедрённого SQL-кода не происходит.

```pgsql
HTTP/1.1 400 Bad Request
Content-Type: application/json; charset=UTF-8

{
  "error": "Invalid request parameters"
}
```

Информация о версии базы данных и иных характеристиках СУБД в ответе отсутствует.

## Сокрытие информации о веб-сервере

В целях снижения риска раскрытия технической информации HTTP-интерфейсы системы не передают сведения о типе и версии используемого веб-сервера.

Во всех HTTP-ответах исключена передача стандартных и расширенных заголовков, содержащих информацию о серверном программном обеспечении, включая `Server`, `X-Powered-By`, а также аналогичные заголовки сторонних компонентов и middleware.

Поведение единообразно для всех HTTP-эндпоинтов системы, включая REST-интерфейсы.

**Пример**

```css
HTTP/1.1 303 See Other
location: https://global-qas.oil.gas/login/login.html?return-uri-Lw==
content-length: 0
```