Соображения безопасности
Модуль JSON:API в Drupal предназначен для того, чтобы взять модель данных, определённую через Entity API, Field API и Typed Data API, и предоставить её в виде API, соответствующего спецификации JSON:API, что позволяет удобно взаимодействовать с сущностями, управляемыми в Drupal.
При этом он соблюдает все меры безопасности Drupal:
- Учитывается доступ к сущностям (Entity Access).
- Учитывается доступ к полям (Field Access).
- При изменении данных соблюдаются правила валидации.
- Соблюдается флаг
internal
(см. документацию).
Иными словами: JSON:API не обходит существующие механизмы безопасности и не добавляет собственных — он использует фундамент Drupal.
Ошибки в типах сущностей, полях и типах данных могут привести к уязвимостям
Однако баги всё же бывают — особенно в устаревших модулях или пользовательском коде. Это связано с тем, что раньше Drupal использовал валидацию на уровне форм, и переход к API-first архитектуре ещё не завершён во всех модулях.
Подобные уязвимости затрагивают не только JSON:API, но и RESTful Web Services, а также любой PHP-код, работающий с Entity API.
Поскольку доступ к HTTP API проще, чем к PHP API, при использовании JSON:API требуется повышенное внимание.
Шесть рекомендаций по безопасности
1. Используйте только стабильные модули
Drupal выпускает обновления безопасности только для стабильных модулей, опубликованных на drupal.org. Пользовательские и нестабильные модули не покрываются системой уведомлений об уязвимостях.
2. Проверяйте доступ к сущностям и полям
Всегда выполняйте аудит Entity и Field Access, особенно если разрешены операции записи через JSON:API. Существуют инструменты, например Entity Access Audit.
3. Публикуйте только необходимые ресурсы
Отключите неиспользуемые ресурсы и поля с помощью кастомного модуля или модуля JSON:API Extras.
4. Включите режим только для чтения
Если запись данных не требуется, включите read-only режим в /admin/config/services/jsonapi
. Он включён по умолчанию с версии 2.4 модуля.
5. Скрытие пути к JSON:API
Измените базовый путь API с /jsonapi
на что-то вроде /hidden/b69dhj027ooae/jsonapi
, добавив параметр в services.yml
:
parameters:
jsonapi.base_path: /hidden/b69dhj027ooae/jsonapi
6. Ограничьте создание/редактирование определённых bundle'ов
С помощью event subscriber можно удалить маршруты POST/PATCH/DELETE, кроме whitelisted. Пример добавления в services.yml
:
services:
mymodule.route_subscriber:
class: Drupal\mymodule\Routing\JsonapiLimitingRouteSubscriber
tags:
- { name: event_subscriber }
Класс-обработчик может фильтровать нужные маршруты, оставляя только безопасные.
Ограничьте доступ к JSON:API с помощью дополнительного разрешения
Можно потребовать дополнительное разрешение для доступа к JSON:API, добавив в подписчик маршрутов:
foreach ($collection as $route) {
$defaults = $route->getDefaults();
if (!empty($defaults['_is_jsonapi'])) {
$route->setRequirement('_permission', 'access custom jsonapi');
}
}
Не забудьте определить это разрешение в FOO.permissions.yml
и выдать его нужным ролям.