Schema Aracılığıyla PHP Sabitleri ve Ortam Değişkenleri
Bir ortam değişkeninin veya PHP sabitinin değerini sorgulayın.
Açıklama
Bu eklenti, GraphQL şemasına _env global alanını ekler; bu alan, bir ortam değişkeninden veya bir PHP sabitinden (wp-config.php dosyasında tanımlanan en yaygın olanı, ancak başka yerlerde de tanımlanabilir) değer almanızı sağlar.
Güvenlik nedeniyle, erişilebilecek ortam değişkeninin ve sabitlerin adları açıkça yapılandırılmalıdır.
_env alanı, "name" parametresi aracılığıyla ortam değişkeninin veya sabitin adını alır ve şu şekilde çözümlenir:
- O adda bir ortam değişkeni varsa, onu döndürür
- Aksi takdirde, o adda bir sabit varsa, onu döndürür
- Aksi takdirde,
nulldöndürür ve GraphQL çıktısına bir hata ekler.
Örneğin, bu query GitHub'daki özel bir depoya erişmek için ayarlayabileceğimiz GITHUB_ACCESS_TOKEN ortam sabitini alır:
{
githubAccessToken: _env(name: "GITHUB_ACCESS_TOKEN")
}Bu query, wp-config.php dosyasında tanımlanan DB yapılandırmasını alır:
{
dbName: _env(name: "DB_NAME")
dbUser: _env(name: "DB_USER")
dbPassword: _env(name: "DB_PASSWORD")
dbHost: _env(name: "DB_HOST")
}Ortam sabitlerına erişimi yapılandırma
Sorgulanabilecek izin verilen ortam değişkenleri ve sabitlerin listesini yapılandırmalıyız.
Her giriş şunlardan biri olabilir:
/veya#ile çevrelenmiş ise bir regex (düzenli ifade), ya da- Aksi takdirde tam değişken veya sabit adı
Örneğin, bu girişlerin herhangi biri "GITHUB_ACCESS_TOKEN" ortam değişkeniyle eşleşir:
GITHUB_ACCESS_TOKEN#^([A-Z]*)_ACCESS_TOKEN$#/GITHUB_(\S+)/
Bu yapılandırmanın gerçekleşebileceği 2 yer vardır; öncelik sırasına göre:
- Özel: İlgili Schema Configuration'da
- Genel: Ayarlar sayfasında
Uç noktaya uygulanan Schema Configuration'da "Use custom configuration" seçeneğini seçin ve ardından istenen girişleri girin:

Aksi takdirde, Ayarlar'daki "Environment Fields" sekmesinde tanımlanan girişler kullanılır:

"Allow access" ve "Deny access" olmak üzere 2 davranış vardır:
- Allow access: yalnızca yapılandırılan girişlere erişilebilir, diğerlerine erişilemez
- Deny access: yapılandırılan girişlere erişilemez, diğer tüm girişlere erişilebilir

Güvenlik: Ortam değişkenlerine erişim
Eklenti, hassas verilerin açığa çıkmasını önlemek için birkaç koruma katmanı uygular:
-
Kullanıcıların bu alanlara erişebilmesi için oturum açmış olması gerekir.
-
Sorgulanabilecek ortam değişkenlerinin listesi varsayılan olarak boştur, bu nedenle açıkça yapılandırılana kadar hiçbir giriş okunamaz.
-
Yönetici kullanıcıların tüm ortam değişkenlerine erişimi vardır.
-
Yönetici olmayan kullanıcılar için, aşağıdaki ortam değişkenlerine, yapılandırmada açıkça izin verilse bile, erişim her zaman reddedilir:
WordPress ortam değişkenleri:
AUTH_KEYSECURE_AUTH_KEYLOGGED_IN_KEYNONCE_KEYAUTH_SALTSECURE_AUTH_SALTLOGGED_IN_SALTNONCE_SALTDB_NAMEDB_USERDB_PASSWORDDB_HOSTDB_CHARSETDB_COLLATE
Adlarında şu alt dizelerden herhangi birini içeren ortam değişkenleri:
PASSWORDPASSWDSECRETPRIVATE_KEYAPI_KEYAPIKEYACCESS_KEYACCESS_TOKENAUTH_TOKENBEARERCREDENTIALSALT
Güvenlik: Kimlik bilgilerini açığa çıkarmama
GraphQL API'miz herkese açık değilse (statik bir site oluşturmak gibi durumlarda) GraphQL query'nin özel verileri açığa çıkarmamasına dikkat etmeliyiz:
- Query'nin yanıtında
- Bir hata oluştuğunda çıktıda
- Günlüklerde
Örneğin, aşağıdaki query:
{
githubAccessToken: _env(name: "GITHUB_ACCESS_TOKEN")
}...kimlik bilgilerini doğrudan yanıtta yazdıracaktır:
{
"data": {
"githubAccessToken": "{some access token}"
}
}GraphQL query'yi güvenli hale getirmek için eklentideki diğer özelliklerden birkaçını kullanabiliriz:
- Field to Input: ortam değerini dinamik bir değişken aracılığıyla başka bir alana enjekte etmek için
- Field Response Removal: ortam değişkeninin değerinin çıktıda yazdırılmasını önlemek için
- HTTP Client: GraphQL query'nin içinden doğrudan harici bir hizmete bağlanmak için
Örneğin, aşağıdaki query özel bir erişim token'ı kullanarak GitHub REST API'sine bağlanır:
{
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
},
]
}
}
)
}Bu query'de, hassas veri içeren githubAccessToken ve authorizationHeader alanlarının her ikisi de çıktıdan kaldırılır ve gitHubArtifactData alanı, girdilerinden herhangi birini sızdırmadan API çağrısının sonuçlarını zaten yazdıracaktır (örneğin: bir hata, değişkenin değeri yerine "$__authorizationHeader" dizesini yazdıracaktır).