Ders 21: Servislere bağlanırken kimlik bilgilerini sızdırmamak
Bu GraphQL query, kimlik bilgilerini bir ortam değerinden alır ve bunların yanıt veya günlüklere yazdırılmasını önleyerek güvenlik risklerini ortadan kaldırır:
query {
githubAccessToken: _env(name: "GITHUB_ACCESS_TOKEN")
@remove
_sendJSONObjectItemHTTPRequest(input:{
url: "https://api.github.com/repos/GatoGraphQL/GatoGraphQL",
method: PATCH,
options: {
auth: {
password: $__githubAccessToken
},
body: "{\"has_wiki\":false}"
}
})
}Aşağıda bu query'nin nasıl çalıştığına dair bir açıklama yer almaktadır.
Kimlik bilgileri nasıl sızabilir
Dış servislere bağlanırken çoğu zaman kimlik bilgileri sağlamamız gerekir. Örneğin GitHub'ın REST API'si, verilerin özel olduğu veya değiştirildiği uç noktalar için bir erişim token'ı zorunlu kılar:
query {
_sendJSONObjectItemHTTPRequest(input:{
url: "https://api.github.com/repos/GatoGraphQL/GatoGraphQL",
method: PATCH,
options: {
auth: {
password: "{ GITHUB_ACCESS_TOKEN }"
},
body: "{\"has_wiki\":false}"
}
})
}Kimlik bilgilerimizi açığa çıkarmamak için dikkatli olmamız gerekir:
- GraphQL query içinde: Kimlik bilgileri hiçbir zaman kaynak koda gömülmemelidir; bu bilgiler düz metin olarak yer alacağından güvenlik riski oluşturur
- GraphQL yanıtında: Servise bağlanan alan bir hata üretirse, GraphQL yanıtına
errorsgirdisi altında bir hata mesajı eklenir; bu mesaj, başarısız olan alanın adını ve argümanlarıyla birlikte yazdırabilir, dolayısıyla kimlik bilgilerini de açığa çıkarabilir - Sunucu günlüklerinde: Kimlik bilgileri bir değişken aracılığıyla erişiliyorsa ve bu değişken URL parametresi olarak sağlanıyorsa, web sunucusunun günlüklerine kaydedilebilir
Kimlik bilgilerinin sızmasını önleyen GraphQL query
Bu GraphQL query, kimlik bilgilerini GitHub'ın API'sine iletirken sızdırılmasını önler:
query {
githubAccessToken: _env(name: "GITHUB_ACCESS_TOKEN")
@remove
_sendJSONObjectItemHTTPRequest(input:{
url: "https://api.github.com/repos/GatoGraphQL/GatoGraphQL",
method: PATCH,
options: {
auth: {
password: $__githubAccessToken
},
body: "{\"has_wiki\":false}"
}
})
}Bunun nedeni şudur:
- Kimlik bilgileri bir ortam değişkeninden (
GITHUB_ACCESS_TOKEN) alınır; bu nedenle kaynak koda gömülmeleri gerekmez githubAccessTokenalanı@removeile kaldırılır; dolayısıyla yanıta yazdırılmaz_sendJSONObjectItemHTTPRequest(auth:)girdisi$__githubAccessTokendinamik değişkenine başvurur; bu nedenle alan bir hata üretirse, hata mesajında değeri değil"$__githubAccessToken"değişmez dizesi yazdırılır
Son maddeyi göstermek amacıyla, GitHub'ın API'sine var olmayan bir depo URL'si ("leoloso/NonExisting") verildiğinde bir hata oluşur ve şu yanıtı alırız (hata mesajındaki auth: {password: $__githubAccessToken} ifadesine dikkat edin):
{
"errors": [
{
"message": "Client error: `PATCH https://api.github.com/repos/leoloso/NonExisting` resulted in a `404 Not Found` response:\n{\"message\":\"Not Found\",\"documentation_url\":\"https://docs.github.com/rest/repos/repos#update-a-repository\"}\n",
"locations": [
{
"line": 21,
"column": 3
}
],
"extensions": {
"path": [
"_sendJSONObjectItemHTTPRequest(input: {url: \"https://api.github.com/repos/leoloso/NonExisting\", method: PATCH, options: {auth: {password: $__githubAccessToken}, body: \"{\"has_wiki\":false}\"}})",
"query { ... }"
],
"type": "QueryRoot",
"field": "_sendJSONObjectItemHTTPRequest(input: {url: \"https://api.github.com/repos/leoloso/NonExisting\", method: PATCH, options: {auth: {password: $__githubAccessToken}, body: \"{\"has_wiki\":false}\"}})",
"id": "root",
"code": "PoP/ComponentModel@e1"
}
}
],
"data": {
"_sendJSONObjectItemHTTPRequest": null
}
}