Costanti PHP e Variabili d'Ambiente via Schema
Recupera il valore di una variabile d'ambiente o di una costante PHP.
Descrizione
Questa estensione aggiunge il campo globale _env allo schema GraphQL, che permette di ottenere un valore da una variabile d'ambiente, o da una costante PHP (più comunemente definita in wp-config.php, ma può anche essere definita altrove).
Per motivi di sicurezza, il nome della variabile d'ambiente e delle costanti accessibili deve essere configurato esplicitamente.
Il campo _env riceve il nome della variabile d'ambiente o della costante tramite il parametro "name", e viene risolto come segue:
- Se esiste una variabile d'ambiente con quel nome, viene restituita
- Altrimenti, se esiste una costante con quel nome, viene restituita
- Altrimenti, viene restituito
nulle viene aggiunto un errore all'output GraphQL.
Per esempio, questa query recupera la costante d'ambiente GITHUB_ACCESS_TOKEN che potremmo configurare per accedere a un repository privato su GitHub:
{
githubAccessToken: _env(name: "GITHUB_ACCESS_TOKEN")
}Questa query recupera la configurazione del DB definita nel file wp-config.php:
{
dbName: _env(name: "DB_NAME")
dbUser: _env(name: "DB_USER")
dbPassword: _env(name: "DB_PASSWORD")
dbHost: _env(name: "DB_HOST")
}Configurare l'accesso alle costanti d'ambiente
Dobbiamo configurare l'elenco delle variabili d'ambiente e delle costanti consentite che possono essere interrogate.
Ogni voce può essere:
- Una regex (espressione regolare), se è racchiusa tra
/o#, oppure - Il nome completo della variabile o della costante, altrimenti
Per esempio, ognuna di queste voci corrisponde alla variabile d'ambiente "GITHUB_ACCESS_TOKEN":
GITHUB_ACCESS_TOKEN#^([A-Z]*)_ACCESS_TOKEN$#/GITHUB_(\S+)/
Ci sono 2 punti in cui questa configurazione può essere effettuata, in ordine di priorità:
- Personalizzata: Nella Schema Configuration corrispondente
- Generale: Nella pagina delle Impostazioni
Nella Schema Configuration applicata all'endpoint, seleziona l'opzione "Use custom configuration" e poi inserisci le voci desiderate:

Altrimenti, verranno utilizzate le voci definite nella scheda "Environment Fields" delle Impostazioni:

Ci sono 2 comportamenti, "Allow access" e "Deny access":
- Allow access: solo le voci configurate possono essere accedute, nessun'altra può
- Deny access: le voci configurate non possono essere accedute, tutte le altre voci possono

Sicurezza: Accesso alle variabili d'ambiente
L'estensione applica diversi livelli di protezione per evitare l'esposizione di dati sensibili:
-
Gli utenti devono aver effettuato l'accesso per accedere a questi campi.
-
L'elenco delle variabili d'ambiente interrogabili è vuoto per impostazione predefinita, quindi nessuna voce è leggibile finché non viene configurata esplicitamente.
-
Gli utenti admin hanno accesso a tutte le variabili d'ambiente.
-
Per gli utenti non admin, alle seguenti variabili d'ambiente viene sempre negato l'accesso — anche quando sono esplicitamente consentite nella configurazione:
Variabili d'ambiente WordPress:
AUTH_KEYSECURE_AUTH_KEYLOGGED_IN_KEYNONCE_KEYAUTH_SALTSECURE_AUTH_SALTLOGGED_IN_SALTNONCE_SALTDB_NAMEDB_USERDB_PASSWORDDB_HOSTDB_CHARSETDB_COLLATE
Variabili d'ambiente contenenti una di queste sottostringhe nel loro nome:
PASSWORDPASSWDSECRETPRIVATE_KEYAPI_KEYAPIKEYACCESS_KEYACCESS_TOKENAUTH_TOKENBEARERCREDENTIALSALT
Sicurezza: Non esporre le credenziali
A meno che la nostra API GraphQL non sia esposta pubblicamente (come nel caso della costruzione di un sito statico), dobbiamo fare attenzione affinché la query GraphQL non esponga dati privati:
- Nella risposta della query
- Nell'output quando si verifica un errore
- Nei log
Per esempio, la seguente query:
{
githubAccessToken: _env(name: "GITHUB_ACCESS_TOKEN")
}...stamperà direttamente le credenziali nella risposta:
{
"data": {
"githubAccessToken": "{some access token}"
}
}Possiamo utilizzare diverse altre funzionalità del plugin per rendere sicura la query GraphQL:
- Field to Input per iniettare il valore d'ambiente in un altro campo tramite una variabile dinamica
- Field Response Removal per evitare di stampare il valore della variabile d'ambiente nell'output
- HTTP Client per connettersi direttamente a un servizio esterno già dall'interno della query GraphQL
Per esempio, la seguente query si connette all'API REST di GitHub utilizzando un token di accesso privato:
{
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 questa query, i campi githubAccessToken e authorizationHeader (che contengono dati sensibili) vengono entrambi rimossi dall'output, e il campo gitHubArtifactData stamperà già i risultati della chiamata API, senza esporre nessuno dei suoi input (ad esempio: un errore stamperà la stringa "$__authorizationHeader" invece del valore della variabile).