Funzioni dello schema
Funzioni dello schemaCostanti PHP e Variabili d'Ambiente via Schema

Costanti PHP e Variabili d'Ambiente via Schema

Included in the “Power Extensions” bundle

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 null e 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à:

  1. Personalizzata: Nella Schema Configuration corrispondente
  2. Generale: Nella pagina delle Impostazioni

Nella Schema Configuration applicata all'endpoint, seleziona l'opzione "Use custom configuration" e poi inserisci le voci desiderate:

Definire le voci nella Schema Configuration

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

Definire le voci nelle Impostazioni
Definire le voci nelle 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
Definire il comportamento di accesso
Definire il comportamento di accesso

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_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

    Variabili d'ambiente contenenti una di queste sottostringhe nel loro nome:

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

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).