Schemafuncties
SchemafunctiesPHP-constanten en omgevingsvariabelen via Schema

PHP-constanten en omgevingsvariabelen via Schema

Included in the “Power Extensions” bundle

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 null terug 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:

  1. Aangepast: In de bijbehorende Schemaconfiguratie
  2. 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:

De vermeldingen definiëren in de Schemaconfiguratie

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

De vermeldingen definiëren in de Instellingen
De vermeldingen definiëren 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
Het toegangsgedrag definiëren
Het toegangsgedrag definiëren

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

    Omgevingsvariabelen met een van deze substrings in hun naam:

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

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