PHP-constanten en omgevingsvariabelen via Schema
Haal de waarde op uit een omgevingsvariabele of PHP-constante.
Beschrijving
Deze extensie voegt het globale veld _env toe aan het GraphQL-schema, waarmee je een waarde kunt ophalen uit een omgevingsvariabele of uit een PHP-constante (meestal gedefinieerd in wp-config.php, maar kan ook elders gedefinieerd zijn).
Om veiligheidsredenen moet de naam van de omgevingsvariabele en constanten die toegankelijk zijn, expliciet worden geconfigureerd.
Het veld _env ontvangt de naam van de omgevingsvariabele of constante via parameter "name" en wordt als volgt opgelost:
- Als er een omgevingsvariabele met die naam bestaat, wordt die teruggegeven
- Anders, als er een constante met die naam bestaat, wordt die teruggegeven
- Anders geeft het
nullterug en voegt een fout toe aan de GraphQL-uitvoer.
De volgende query haalt bijvoorbeeld de omgevingsconstante GITHUB_ACCESS_TOKEN op, die we kunnen instellen om toegang te krijgen tot een privérepository op GitHub:
{
githubAccessToken: _env(name: "GITHUB_ACCESS_TOKEN")
}Deze query haalt de DB-configuratie op die is gedefinieerd in het wp-config.php-bestand:
{
dbName: _env(name: "DB_NAME")
dbUser: _env(name: "DB_USER")
dbPassword: _env(name: "DB_PASSWORD")
dbHost: _env(name: "DB_HOST")
}Toegang tot omgevingsconstanten configureren
We moeten de lijst met toegestane omgevingsvariabelen en constanten configureren die opgevraagd kunnen worden.
Elke vermelding kan zijn:
- Een regex (reguliere expressie), als deze omgeven is door
/of#, of - De volledige naam van de variabele of constante, anders
De volgende vermeldingen komen bijvoorbeeld allemaal overeen met omgevingsvariabele "GITHUB_ACCESS_TOKEN":
GITHUB_ACCESS_TOKEN#^([A-Z]*)_ACCESS_TOKEN$#/GITHUB_(\S+)/
Er zijn 2 plaatsen waar deze configuratie kan plaatsvinden, op volgorde van prioriteit:
- Aangepast: In de bijbehorende Schemaconfiguratie
- Algemeen: Op de Instellingenpagina
Selecteer in de Schemaconfiguratie die op het endpoint is toegepast de optie "Use custom configuration" en voer de gewenste vermeldingen in:

Anders worden de vermeldingen gebruikt die zijn gedefinieerd op het tabblad "Environment Fields" in de Instellingen:

Er zijn 2 gedragingen, "Allow access" en "Deny access":
- Allow access: alleen de geconfigureerde vermeldingen zijn toegankelijk, geen andere
- Deny access: de geconfigureerde vermeldingen zijn niet toegankelijk, alle andere vermeldingen wel

Beveiliging: Toegang tot omgevingsvariabelen
De extensie past meerdere beschermingslagen toe om te voorkomen dat gevoelige gegevens worden blootgesteld:
-
Gebruikers moeten ingelogd zijn om toegang te krijgen tot deze velden.
-
De lijst met omgevingsvariabelen die opgevraagd kunnen worden is standaard leeg, zodat er geen vermeldingen leesbaar zijn totdat ze expliciet zijn geconfigureerd.
-
Beheerders hebben toegang tot alle omgevingsvariabelen.
-
Voor niet-beheerders wordt toegang tot de volgende omgevingsvariabelen altijd geweigerd — zelfs als ze expliciet zijn toegestaan in de configuratie:
WordPress-omgevingsvariabelen:
AUTH_KEYSECURE_AUTH_KEYLOGGED_IN_KEYNONCE_KEYAUTH_SALTSECURE_AUTH_SALTLOGGED_IN_SALTNONCE_SALTDB_NAMEDB_USERDB_PASSWORDDB_HOSTDB_CHARSETDB_COLLATE
Omgevingsvariabelen met een van deze substrings in hun naam:
PASSWORDPASSWDSECRETPRIVATE_KEYAPI_KEYAPIKEYACCESS_KEYACCESS_TOKENAUTH_TOKENBEARERCREDENTIALSALT
Beveiliging: Geen inloggegevens blootstellen
Tenzij onze GraphQL API niet publiek toegankelijk is (zoals bij het bouwen van een statische site), moeten we ervoor zorgen dat de GraphQL-query geen privégegevens blootstelt:
- In de reactie van de query
- In de uitvoer wanneer er een fout optreedt
- In de logs
De volgende query bijvoorbeeld:
{
githubAccessToken: _env(name: "GITHUB_ACCESS_TOKEN")
}...drukt de inloggegevens direct af in de reactie:
{
"data": {
"githubAccessToken": "{some access token}"
}
}We kunnen verschillende andere functies van de plugin gebruiken om de GraphQL-query veilig te maken:
- Field to Input om de omgevingswaarde via een dynamische variabele in een ander veld te injecteren
- Field Response Removal om te voorkomen dat de waarde van de omgevingsvariabele in de uitvoer wordt afgedrukt
- HTTP Client om rechtstreeks vanuit de GraphQL-query verbinding te maken met een externe dienst
De volgende query maakt bijvoorbeeld verbinding met de GitHub REST API via een privé-toegangstoken:
{
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 deze query worden de velden githubAccessToken en authorizationHeader (die gevoelige gegevens bevatten) allebei verwijderd uit de uitvoer, en het veld gitHubArtifactData drukt al de resultaten van de API-aanroep af, zonder dat de invoergegevens worden gelekt (een fout drukt bijvoorbeeld de string "$__authorizationHeader" af in plaats van de waarde van de variabele).