Schema-Funktionen
Schema-FunktionenPHP-Konstanten und Umgebungsvariablen via Schema

PHP-Konstanten und Umgebungsvariablen via Schema

Included in the “Power Extensions” bundle

Den Wert einer Umgebungsvariable oder PHP-Konstante abfragen.

Beschreibung

Diese Erweiterung fügt das globale Feld _env zum GraphQL-Schema hinzu, mit dem du einen Wert aus einer Umgebungsvariable oder einer PHP-Konstante abrufen kannst (am häufigsten in wp-config.php definiert, kann aber auch anderswo definiert sein).

Aus SicherheitsgrĂĽnden muss der Name der Umgebungsvariable und der Konstanten, auf die zugegriffen werden darf, explizit konfiguriert werden.

Das Feld _env erhält den Namen der Umgebungsvariable oder Konstante über den Parameter "name" und wird wie folgt aufgelöst:

  • Wenn es eine Umgebungsvariable mit diesem Namen gibt, wird sie zurĂĽckgegeben
  • Andernfalls, wenn es eine Konstante mit diesem Namen gibt, wird sie zurĂĽckgegeben
  • Andernfalls wird null zurĂĽckgegeben und dem GraphQL-Output ein Fehler hinzugefĂĽgt.

Diese query ruft zum Beispiel die Umgebungskonstante GITHUB_ACCESS_TOKEN ab, die wir einrichten könnten, um auf ein privates Repository auf GitHub zuzugreifen:

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

Diese query ruft die in der Datei wp-config.php definierte DB-Konfiguration ab:

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

Zugriff auf die Umgebungskonstanten konfigurieren

Du musst die Liste der erlaubten Umgebungsvariablen und Konstanten konfigurieren, die abgefragt werden dĂĽrfen.

Jeder Eintrag kann entweder sein:

  • Eine Regex (regulärer Ausdruck), wenn er von / oder # umschlossen ist, oder
  • Der vollständige Variablen- oder Konstantenname, andernfalls

Zum Beispiel stimmt jeder dieser Einträge mit der Umgebungsvariable "GITHUB_ACCESS_TOKEN" überein:

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

Es gibt 2 Stellen, an denen diese Konfiguration vorgenommen werden kann, in Prioritätsreihenfolge:

  1. Benutzerdefiniert: In der entsprechenden Schema Configuration
  2. Allgemein: Auf der Einstellungsseite

Wähle in der auf den Endpoint angewendeten Schema Configuration die Option "Use custom configuration" aus und gib dann die gewünschten Einträge ein:

Die Einträge in der Schema Configuration festlegen

Andernfalls werden die in der Registerkarte "Environment Fields" der Einstellungen definierten Einträge verwendet:

Die Einträge in den Einstellungen festlegen
Die Einträge in den Einstellungen festlegen

Es gibt 2 Verhaltensweisen, "Allow access" und "Deny access":

  • Allow access: Nur die konfigurierten Einträge können abgerufen werden, kein anderer
  • Deny access: Die konfigurierten Einträge können nicht abgerufen werden, alle anderen Einträge können es
Das Zugriffsverhalten festlegen
Das Zugriffsverhalten festlegen

Sicherheit: Zugriff auf Umgebungsvariablen

Die Erweiterung erzwingt mehrere Schutzebenen, um zu verhindern, dass sensible Daten offengelegt werden:

  • Benutzer mĂĽssen eingeloggt sein, um auf diese Felder zugreifen zu können.

  • Die Liste der abfragbaren Umgebungsvariablen ist standardmäßig leer, sodass keine Einträge lesbar sind, bis sie explizit konfiguriert werden.

  • Admin-Benutzer haben Zugriff auf alle Umgebungsvariablen.

  • FĂĽr Nicht-Admin-Benutzer wird den folgenden Umgebungsvariablen der Zugriff immer verweigert — auch wenn sie in der Konfiguration explizit erlaubt sind:

    WordPress-Umgebungsvariablen:

    • 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

    Umgebungsvariablen, die eine dieser Teilzeichenfolgen in ihrem Namen enthalten:

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

Sicherheit: Keine Anmeldedaten offenlegen

Sofern unsere GraphQL-API nicht öffentlich zugänglich ist (z. B. beim Erstellen einer statischen Website), müssen wir darauf achten, dass die GraphQL-query keine privaten Daten offenlegt:

  • In der Antwort der query
  • Im Output, wenn ein Fehler auftritt
  • In den Logs

Die folgende query zum Beispiel:

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

...gibt die Anmeldedaten direkt in der Antwort aus:

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

Wir können mehrere andere Funktionen des Plugins verwenden, um die GraphQL-query sicher zu machen:

  • Field to Input, um den Umgebungswert ĂĽber eine dynamische Variable in ein anderes Feld einzufĂĽgen
  • Field Response Removal, um zu vermeiden, dass der Wert der Umgebungsvariable im Output ausgegeben wird
  • HTTP Client, um direkt aus der GraphQL-query heraus eine Verbindung zu einem externen Dienst herzustellen

Die folgende query verbindet sich beispielsweise ĂĽber ein privates Zugriffstoken mit der 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
          },
        ]
      }
    }
  )
}

In dieser query werden die Felder githubAccessToken und authorizationHeader (die sensible Daten enthalten) beide aus dem Output entfernt, und das Feld gitHubArtifactData gibt bereits die Ergebnisse des API-Aufrufs aus, ohne dessen Eingaben zu verraten (z. B. gibt ein Fehler die Zeichenfolge "$__authorizationHeader" aus, anstatt den Wert der Variable).