Hàm Schema
Hàm SchemaHằng Số PHP và Biến Môi Trường qua Schema

Hằng Số PHP và Biến Môi Trường qua Schema

Included in the “Power Extensions” bundle

Truy vấn giá trị từ một biến môi trường hoặc hằng số PHP.

Mô tả

Tiện ích mở rộng này thêm field toàn cục _env vào schema GraphQL, cho phép lấy giá trị từ một biến môi trường, hoặc từ một hằng số PHP (thường được định nghĩa trong wp-config.php, nhưng cũng có thể được định nghĩa ở nơi khác).

Vì lý do bảo mật, tên của biến môi trường và các hằng số có thể truy cập phải được cấu hình rõ ràng.

Field _env nhận tên của biến môi trường hoặc hằng số qua tham số "name", và được phân giải như sau:

  • Nếu có biến môi trường với tên đó, nó sẽ được trả về
  • Nếu không, nếu có hằng số với tên đó, nó sẽ được trả về
  • Nếu không, nó trả về null và thêm một lỗi vào output GraphQL.

Ví dụ, queries sau truy xuất hằng số môi trường GITHUB_ACCESS_TOKEN mà chúng ta có thể thiết lập để truy cập một repository riêng tư trên GitHub:

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

Queries này truy xuất cấu hình DB được định nghĩa trong file wp-config.php:

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

Cấu hình quyền truy cập vào các hằng số môi trường

Chúng ta phải cấu hình danh sách các biến môi trường và hằng số được phép có thể được truy vấn.

Mỗi mục có thể là:

  • Một regex (biểu thức chính quy), nếu được bao quanh bởi / hoặc #, hoặc
  • Tên đầy đủ của biến hoặc hằng số, nếu không

Ví dụ, bất kỳ mục nào trong số này đều khớp với biến môi trường "GITHUB_ACCESS_TOKEN":

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

Có 2 nơi có thể thực hiện cấu hình này, theo thứ tự ưu tiên:

  1. Tùy chỉnh: Trong Schema Configuration tương ứng
  2. Chung: Trong trang Cài đặt

Trong Schema Configuration được áp dụng cho endpoint, chọn tùy chọn "Use custom configuration" rồi nhập các mục mong muốn:

Định nghĩa các mục trong Schema Configuration

Nếu không, các mục được định nghĩa trong tab "Environment Fields" từ phần Cài đặt sẽ được sử dụng:

Định nghĩa các mục trong Cài đặt
Định nghĩa các mục trong Cài đặt

Có 2 hành vi, "Allow access" và "Deny access":

  • Allow access: chỉ các mục được cấu hình mới có thể được truy cập, không có mục nào khác
  • Deny access: các mục được cấu hình không thể được truy cập, tất cả các mục khác đều có thể
Định nghĩa hành vi truy cập
Định nghĩa hành vi truy cập

Bảo mật: Truy cập biến môi trường

Tiện ích mở rộng thực thi nhiều lớp bảo vệ để ngăn dữ liệu nhạy cảm bị lộ:

  • Người dùng phải đăng nhập để truy cập các field này.

  • Danh sách biến môi trường có thể truy vấn mặc định là trống, vì vậy không có mục nào có thể đọc được cho đến khi được cấu hình rõ ràng.

  • Người dùng Admin có quyền truy cập vào tất cả các biến môi trường.

  • Đối với người dùng không phải admin, các biến môi trường sau luôn bị từ chối truy cập — ngay cả khi được cho phép rõ ràng trong cấu hình:

    Biến môi trường 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

    Biến môi trường có bất kỳ chuỗi con nào trong số này trong tên của chúng:

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

Bảo mật: Không để lộ thông tin xác thực

Trừ khi GraphQL API của chúng ta không được công khai (chẳng hạn như khi xây dựng một trang web tĩnh), chúng ta phải cẩn thận để queries GraphQL không để lộ dữ liệu riêng tư:

  • Trong phản hồi của queries
  • Trong output khi xảy ra lỗi
  • Trong logs

Ví dụ, queries sau:

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

...sẽ in trực tiếp thông tin xác thực trong phản hồi:

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

Chúng ta có thể sử dụng một số tính năng khác trong plugin để làm cho queries GraphQL trở nên an toàn:

  • Field to Input để đưa giá trị môi trường vào một field khác qua biến động
  • Field Response Removal để tránh in giá trị của biến môi trường ra output
  • HTTP Client để kết nối trực tiếp đến một dịch vụ bên ngoài ngay từ bên trong queries GraphQL

Ví dụ, queries sau kết nối với GitHub REST API sử dụng token truy cập riêng tư:

{
  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
          },
        ]
      }
    }
  )
}

Trong queries này, các field githubAccessTokenauthorizationHeader (chứa dữ liệu nhạy cảm) đều bị xóa khỏi output, và field gitHubArtifactData sẽ in kết quả của lệnh gọi API, mà không để lộ bất kỳ input nào của nó (ví dụ: một lỗi sẽ in chuỗi "$__authorizationHeader" thay vì giá trị của biến).