Константы PHP и переменные окружения через схему
Получение значения переменной окружения или константы 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 места, где можно выполнить эту настройку, в порядке приоритета:
- Пользовательская: в соответствующей Schema Configuration
- Общая: на странице настроек
В Schema Configuration, применённой к эндпоинту, выберите опцию "Use custom configuration", а затем введите нужные записи:

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

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

Безопасность: доступ к переменным окружения
Расширение применяет несколько уровней защиты, чтобы предотвратить утечку конфиденциальных данных:
-
Пользователи должны быть авторизованы для доступа к этим полям.
-
Список переменных окружения, к которым можно обращаться, по умолчанию пуст, поэтому ни одна запись не доступна для чтения до явной настройки.
-
Администраторы имеют доступ ко всем переменным окружения.
-
Для не-администраторов следующие переменные окружения всегда заблокированы — даже если они явно разрешены в конфигурации:
Переменные окружения WordPress:
AUTH_KEYSECURE_AUTH_KEYLOGGED_IN_KEYNONCE_KEYAUTH_SALTSECURE_AUTH_SALTLOGGED_IN_SALTNONCE_SALTDB_NAMEDB_USERDB_PASSWORDDB_HOSTDB_CHARSETDB_COLLATE
Переменные окружения, содержащие любую из следующих подстрок в имени:
PASSWORDPASSWDSECRETPRIVATE_KEYAPI_KEYAPIKEYACCESS_KEYACCESS_TOKENAUTH_TOKENBEARERCREDENTIALSALT
Безопасность: предотвращение утечки учётных данных
Если наш 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" вместо значения переменной).