PHP-Konstanten und Umgebungsvariablen via Schema
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
nullzurĂĽ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:
- Benutzerdefiniert: In der entsprechenden Schema Configuration
- 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:

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

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

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_KEYSECURE_AUTH_KEYLOGGED_IN_KEYNONCE_KEYAUTH_SALTSECURE_AUTH_SALTLOGGED_IN_SALTNONCE_SALTDB_NAMEDB_USERDB_PASSWORDDB_HOSTDB_CHARSETDB_COLLATE
Umgebungsvariablen, die eine dieser Teilzeichenfolgen in ihrem Namen enthalten:
PASSWORDPASSWDSECRETPRIVATE_KEYAPI_KEYAPIKEYACCESS_KEYACCESS_TOKENAUTH_TOKENBEARERCREDENTIALSALT
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).