通过 Schema 访问 PHP 常量和环境变量
查询环境变量或 PHP 常量的值。
描述
此扩展为 GraphQL schema 添加了全局字段 _env,可从环境变量或 PHP 常量(通常在 wp-config.php 中定义,也可在其他地方定义)中获取值。
出于安全原因,可访问的环境变量和常量名称必须经过明确配置。
字段 _env 通过参数 "name" 接收环境变量或常量的名称,解析规则如下:
- 如果存在该名称的环境变量,则返回它
- 否则,如果存在该名称的常量,则返回它
- 否则,返回
null并在 GraphQL 输出中添加错误。
例如,以下 query 获取环境常量 GITHUB_ACCESS_TOKEN,该常量用于访问 GitHub 上的私有仓库:
{
githubAccessToken: _env(name: "GITHUB_ACCESS_TOKEN")
}以下 query 获取 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+)/
此配置可在以下两处进行,按优先级排序:
- 自定义:在对应的 Schema Configuration 中
- 通用:在设置页面中
在应用于端点的 Schema Configuration 中,选择选项 "Use custom configuration",然后输入所需条目:

否则,将使用设置中「Environment Fields」标签页中定义的条目:

有「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 query 不得暴露私有数据:
- 在 query 的响应中
- 在发生错误时的输出中
- 在日志中
例如,以下 query:
{
githubAccessToken: _env(name: "GITHUB_ACCESS_TOKEN")
}……会在响应中直接输出凭据:
{
"data": {
"githubAccessToken": "{some access token}"
}
}可以使用插件中的其他功能来确保 GraphQL query 的安全性:
- Field to Input:通过动态变量将环境变量的值注入到另一个字段中
- Field Response Removal:避免在输出中打印环境变量的值
- HTTP Client:在 GraphQL query 内部直接连接到外部服务
例如,以下 query 使用私有访问令牌连接到 GitHub REST API:
{
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
},
]
}
}
)
}在此 query 中,包含敏感数据的字段 githubAccessToken 和 authorizationHeader 均已从输出中移除,字段 gitHubArtifactData 将输出 API 调用的结果,而不会泄露其输入值(例如:发生错误时,将输出字符串 "$__authorizationHeader" 而非变量的实际值)。