Schema Functions
Schema FunctionsКонстанты PHP и переменные окружения через схему

Константы PHP и переменные окружения через схему

Included in the “Power Extensions” bundle

Получение значения переменной окружения или константы PHP.

Описание

Это расширение добавляет глобальное поле _env в схему GraphQL, которое позволяет получить значение из переменной окружения или из константы PHP (чаще всего определённой в wp-config.php, но также может быть определена в другом месте).

По соображениям безопасности имена переменных окружения и констант, к которым можно обращаться, должны быть явно настроены.

Поле _env принимает имя переменной окружения или константы в параметре "name" и разрешается следующим образом:

  • Если существует переменная окружения с таким именем, возвращает её
  • В противном случае, если существует константа с таким именем, возвращает её
  • В противном случае возвращает null и добавляет ошибку в вывод GraphQL.

Например, следующий запрос получает константу окружения GITHUB_ACCESS_TOKEN, которую мы могли бы настроить для доступа к приватному репозиторию на GitHub:

{
  githubAccessToken: _env(name: "GITHUB_ACCESS_TOKEN")
}

Этот запрос получает конфигурацию БД, определённую в файле wp-config.php:

{
  dbName: _env(name: "DB_NAME")
  dbUser: _env(name: "DB_USER")
  dbPassword: _env(name: "DB_PASSWORD")
  dbHost: _env(name: "DB_HOST")
}

Настройка доступа к константам окружения

Необходимо настроить список разрешённых переменных окружения и констант, к которым можно обращаться.

Каждая запись может быть:

  • Регулярным выражением (regex), если оно заключено в / или #, или
  • Полным именем переменной или константы в противном случае

Например, любая из следующих записей совпадает с переменной окружения "GITHUB_ACCESS_TOKEN":

  • GITHUB_ACCESS_TOKEN
  • #^([A-Z]*)_ACCESS_TOKEN$#
  • /GITHUB_(\S+)/

Есть 2 места, где можно выполнить эту настройку, в порядке приоритета:

  1. Пользовательская: в соответствующей Schema Configuration
  2. Общая: на странице настроек

В Schema Configuration, применённой к эндпоинту, выберите опцию "Use custom configuration", а затем введите нужные записи:

Определение записей в Schema Configuration

В противном случае будут использоваться записи, определённые на вкладке «Environment Fields» в настройках:

Определение записей в настройках
Определение записей в настройках

Есть 2 варианта поведения — «Allow access» и «Deny access»:

  • Allow access: доступ разрешён только к настроенным записям, ко всем остальным — нет
  • Deny access: доступ к настроенным записям запрещён, ко всем остальным — разрешён
Определение поведения доступа
Определение поведения доступа

Безопасность: доступ к переменным окружения

Расширение применяет несколько уровней защиты, чтобы предотвратить утечку конфиденциальных данных:

  • Пользователи должны быть авторизованы для доступа к этим полям.

  • Список переменных окружения, к которым можно обращаться, по умолчанию пуст, поэтому ни одна запись не доступна для чтения до явной настройки.

  • Администраторы имеют доступ ко всем переменным окружения.

  • Для не-администраторов следующие переменные окружения всегда заблокированы — даже если они явно разрешены в конфигурации:

    Переменные окружения WordPress:

    • AUTH_KEY
    • SECURE_AUTH_KEY
    • LOGGED_IN_KEY
    • NONCE_KEY
    • AUTH_SALT
    • SECURE_AUTH_SALT
    • LOGGED_IN_SALT
    • NONCE_SALT
    • DB_NAME
    • DB_USER
    • DB_PASSWORD
    • DB_HOST
    • DB_CHARSET
    • DB_COLLATE

    Переменные окружения, содержащие любую из следующих подстрок в имени:

    • PASSWORD
    • PASSWD
    • SECRET
    • PRIVATE_KEY
    • API_KEY
    • APIKEY
    • ACCESS_KEY
    • ACCESS_TOKEN
    • AUTH_TOKEN
    • BEARER
    • CREDENTIAL
    • SALT

Безопасность: предотвращение утечки учётных данных

Если наш GraphQL API не является полностью закрытым (например, при сборке статического сайта), необходимо следить за тем, чтобы запрос GraphQL не раскрывал приватные данные:

  • В ответе запроса
  • В выводе при возникновении ошибки
  • В логах

Например, следующий запрос:

{
  githubAccessToken: _env(name: "GITHUB_ACCESS_TOKEN")
}

...напрямую выведет учётные данные в ответе:

{
  "data": {
    "githubAccessToken": "{some access token}"
  }
}

Мы можем использовать другие функции плагина, чтобы сделать запрос GraphQL безопасным:

  • Field to Input — для передачи значения переменной окружения в другое поле через динамическую переменную
  • Field Response Removal — чтобы не выводить значение переменной окружения в ответе
  • HTTP Client — для непосредственного подключения к внешнему сервису прямо из запроса GraphQL

Например, следующий запрос подключается к REST API GitHub с использованием приватного токена доступа:

{
  githubAccessToken: _env(name: "GITHUB_ACCESS_TOKEN")
    # This directive will remove this entry from the output
    @remove
 
  # Create the authorization header to send to GitHub
  authorizationHeader: _sprintf(
    string: "Bearer %s",
    # "Field to Input" feature to access value from the field above
    values: [$__githubAccessToken]
  )
    # Do not print in output
    @remove
  
  # Use the field from "Send HTTP Request Fields" to connect to GitHub
  gitHubArtifactData: _sendJSONObjectCollectionHTTPRequest(
    input: {
      url: "https://api.github.com/repos/GatoGraphQL/GatoGraphQL/actions/artifacts",
      options: {
        headers: [
          {
            name: "Accept"
            value: "application/vnd.github+json"
          },
          {
            name: "Authorization"
            # "Field to Input" feature to access value from the field above
            value: $__authorizationHeader
          },
        ]
      }
    }
  )
}

В этом запросе поля githubAccessToken и authorizationHeader (содержащие конфиденциальные данные) оба удаляются из вывода, а поле gitHubArtifactData уже выведет результаты вызова API, не раскрывая ни одного из входных данных (например: ошибка выведет строку "$__authorizationHeader" вместо значения переменной).