Schema Functions
Schema Functions通过 Schema 访问 PHP 常量和环境变量

通过 Schema 访问 PHP 常量和环境变量

Included in the “Power Extensions” bundle

查询环境变量或 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+)/

此配置可在以下两处进行,按优先级排序:

  1. 自定义:在对应的 Schema Configuration 中
  2. 通用:在设置页面中

在应用于端点的 Schema Configuration 中,选择选项 "Use custom configuration",然后输入所需条目:

在 Schema Configuration 中定义条目

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

在设置中定义条目
在设置中定义条目

有「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 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 中,包含敏感数据的字段 githubAccessTokenauthorizationHeader 均已从输出中移除,字段 gitHubArtifactData 将输出 API 调用的结果,而不会泄露其输入值(例如:发生错误时,将输出字符串 "$__authorizationHeader" 而非变量的实际值)。