Stałe PHP i Zmienne Środowiskowe via Schema
Pobiera wartość ze zmiennej środowiskowej lub stałej PHP.
Opis
To rozszerzenie dodaje globalne pole _env do schematu GraphQL, które umożliwia pobranie wartości ze zmiennej środowiskowej lub ze stałej PHP (najczęściej zdefiniowanej w pliku wp-config.php, ale może być zdefiniowana również w innym miejscu).
Ze względów bezpieczeństwa nazwa zmiennej środowiskowej i stałych, do których można uzyskać dostęp, musi być jawnie skonfigurowana.
Pole _env przyjmuje nazwę zmiennej środowiskowej lub stałej przez parametr "name" i jest rozwiązywane w następujący sposób:
- Jeśli istnieje zmienna środowiskowa o tej nazwie, jest zwracana
- W przeciwnym razie, jeśli istnieje stała o tej nazwie, jest zwracana
- W przeciwnym razie zwraca
nulli dodaje błąd do wyników GraphQL.
Na przykład poniższe query pobiera stałą środowiskową GITHUB_ACCESS_TOKEN, którą możemy skonfigurować w celu uzyskania dostępu do prywatnego repozytorium na GitHub:
{
githubAccessToken: _env(name: "GITHUB_ACCESS_TOKEN")
}To query pobiera konfigurację bazy danych zdefiniowaną w pliku wp-config.php:
{
dbName: _env(name: "DB_NAME")
dbUser: _env(name: "DB_USER")
dbPassword: _env(name: "DB_PASSWORD")
dbHost: _env(name: "DB_HOST")
}Konfigurowanie dostępu do stałych środowiskowych
Należy skonfigurować listę dozwolonych zmiennych środowiskowych i stałych, które mogą być odpytywane.
Każdy wpis może być:
- Wyrażeniem regularnym (regex), jeśli jest otoczony
/lub#, lub - Pełną nazwą zmiennej lub stałej, w przeciwnym razie
Na przykład dowolny z poniższych wpisów pasuje do zmiennej środowiskowej "GITHUB_ACCESS_TOKEN":
GITHUB_ACCESS_TOKEN#^([A-Z]*)_ACCESS_TOKEN$#/GITHUB_(\S+)/
Istnieją 2 miejsca, w których można przeprowadzić tę konfigurację, według kolejności priorytetów:
- Niestandardowa: W odpowiedniej Konfiguracji Schematu
- Ogólna: Na stronie Ustawień
W Konfiguracji Schematu zastosowanej do endpointu wybierz opcję "Use custom configuration" i wprowadź żądane wpisy:

W przeciwnym razie zostaną użyte wpisy zdefiniowane w zakładce "Environment Fields" w Ustawieniach:

Istnieją 2 zachowania, "Allow access" i "Deny access":
- Allow access: dostęp mają tylko skonfigurowane wpisy, żadne inne nie mogą
- Deny access: skonfigurowane wpisy nie mogą być dostępne, wszystkie inne wpisy mogą

Bezpieczeństwo: Dostęp do zmiennych środowiskowych
Rozszerzenie stosuje kilka warstw ochrony, aby zapobiec ujawnieniu wrażliwych danych:
-
Użytkownicy muszą być zalogowani, aby uzyskać dostęp do tych pól.
-
Lista zmiennych środowiskowych, które mogą być odpytywane, jest domyślnie pusta, więc żadne wpisy nie są odczytywalne, dopóki nie zostaną jawnie skonfigurowane.
-
Użytkownicy admin mają dostęp do wszystkich zmiennych środowiskowych.
-
Dla użytkowników niebędących adminami następujące zmienne środowiskowe mają zawsze odmowę dostępu — nawet gdy są jawnie dozwolone w konfiguracji:
Zmienne środowiskowe WordPress:
AUTH_KEYSECURE_AUTH_KEYLOGGED_IN_KEYNONCE_KEYAUTH_SALTSECURE_AUTH_SALTLOGGED_IN_SALTNONCE_SALTDB_NAMEDB_USERDB_PASSWORDDB_HOSTDB_CHARSETDB_COLLATE
Zmienne środowiskowe zawierające którykolwiek z tych podciągów w nazwie:
PASSWORDPASSWDSECRETPRIVATE_KEYAPI_KEYAPIKEYACCESS_KEYACCESS_TOKENAUTH_TOKENBEARERCREDENTIALSALT
Bezpieczeństwo: Nieujawnianie danych uwierzytelniających
O ile nasze API GraphQL nie jest niepublicznie udostępnione (na przykład przy budowaniu strony statycznej), należy zadbać o to, aby query GraphQL nie ujawniało prywatnych danych:
- W odpowiedzi query
- W wynikach, gdy wystąpi błąd
- W logach
Na przykład następujące query:
{
githubAccessToken: _env(name: "GITHUB_ACCESS_TOKEN")
}...wydrukuje bezpośrednio dane uwierzytelniające w odpowiedzi:
{
"data": {
"githubAccessToken": "{some access token}"
}
}Możemy skorzystać z kilku innych funkcji wtyczki, aby uczynić query GraphQL bezpiecznym:
- Field to Input do wstrzykiwania wartości środowiskowej do innego pola za pomocą zmiennej dynamicznej
- Field Response Removal aby uniknąć drukowania wartości zmiennej środowiskowej w wynikach
- HTTP Client do bezpośredniego połączenia z zewnętrzną usługą już z poziomu query GraphQL
Na przykład poniższe query łączy się z API REST GitHub za pomocą prywatnego tokena dostępu:
{
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
},
]
}
}
)
}W tym query pola githubAccessToken i authorizationHeader (które zawierają wrażliwe dane) są oba usuwane z wyników, a pole gitHubArtifactData wydrukuje już rezultaty wywołania API, nie ujawniając żadnych jego danych wejściowych (np. błąd wydrukuje ciąg "$__authorizationHeader" zamiast wartości zmiennej).