Şema Fonksiyonları
Şema FonksiyonlarıSchema Aracılığıyla PHP Sabitleri ve Ortam Değişkenleri

Schema Aracılığıyla PHP Sabitleri ve Ortam Değişkenleri

Included in the “Power Extensions” bundle

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, null dö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:

  1. Özel: İlgili Schema Configuration'da
  2. 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:

Schema Configuration'da girişleri tanımlama

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

Ayarlarda girişleri tanımlama
Ayarlarda girişleri tanımlama

"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
Erişim davranışını tanımlama
Erişim davranışını tanımlama

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

    Adlarında şu alt dizelerden herhangi birini içeren ortam değişkenleri:

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

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