Extra Block Types (EBT) - New Layout Builder experience❗

Extra Block Types (EBT) - styled, customizable block types: Slideshows, Tabs, Cards, Accordions and many others. Built-in settings for background, DOM Box, javascript plugins. Experience the future of layout building today.

Demo EBT modules Download EBT modules

❗Extra Paragraph Types (EPT) - New Paragraphs experience

Extra Paragraph Types (EPT) - analogical paragraph based set of modules.

Demo EPT modules Download EPT modules

Scroll
20/04/2025, by Ivan

Модуль 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 и выдать его нужным ролям.