Ana içeriğe geç

CSRF ve origin denetimi

Origin kontrolü ve CSRF aynı tehdidin farklı parçalarını kapatır. Origin isteğin hangi web kaynağından geldiğini sınırlar; CSRF token isteğin aktif session tarafından üretildiğini doğrular.

Exact-origin listesi​

security: {
allowedOrigins: [
"https://dashboard.example.com",
"https://admin.example.com",
],
// ...
}

Origin; protocol, hostname ve port ile normalize edilir. Path allowlist'e dahil değildir. Wildcard, substring veya endsWith() kontrolü kullanma.

Şunlar farklı origin'dir:

  • https://dashboard.example.com
  • https://dashboard.example.com:8443
  • http://dashboard.example.com

Production URL doğrulaması​

1.1.0 production profilinde şu adresleri reddeder:

  • HTTPS kullanmayan app URL ve origin
  • localhost ve *.localhost
  • 127.0.0.0/8
  • 0.0.0.0
  • :: ve ::1
  • loopback'e eşlenen IPv4-mapped IPv6 adresleri

Aynı kontrol Discord OAuth authorize/token endpoint yapılandırmasına da uygulanır. Bu sayede yanlış environment değişkeniyle yerel endpoint'e production token gönderilmesi engellenir.

CSRF secret​

csrfSecret en az 32 byte olmalıdır. Token, session ID hash'i ve rastgele nonce üzerinden HMAC ile üretilir.

const token = gate.csrf.issue(session.idHash);
const valid = gate.csrf.verify(session.idHash, tokenFromHeader);

Secret'ı source control'e koyma. Rotation yapacaksan mevcut session'ların etkisini planla; tek anahtar değişimi mevcut CSRF token'larını geçersiz kılar.

Güvensiz yöntemler​

POST, PUT, PATCH ve DELETE güvensiz yöntem kabul edilir. Action açıkça csrf: "disabled" demedikçe session-bound token gerekir.

GET route içinde veri değiştirme. Cache veya crawler davranışı nedeniyle bu, CSRF korumasının dışında yazma oluşturur.

Örnek istemci isteği:

await fetch("/api/guilds/123/settings", {
method: "PATCH",
credentials: "include",
headers: {
"content-type": "application/json",
"x-csrf-token": csrfToken,
"idempotency-key": crypto.randomUUID(),
},
body: JSON.stringify(payload),
});

CSRF token'ı session cookie içinde aynı değer olarak tutma. Cookie HttpOnly kalırken token kontrollü bir bootstrap endpoint veya HTML payload ile istemciye verilebilir.

Proxy notu​

Origin kontrolü Host, X-Forwarded-Host veya referrer yerine gerçek Origin header'ını esas almalıdır. Reverse proxy'nin header'ları değiştirmediğini ve HTTPS yönlendirmesini doğru yaptığını test et.

Testler​

  • izinli production origin
  • aynı host, farklı port
  • http/https farkı
  • origin header yok
  • bozuk URL
  • yanlış session'a ait CSRF token
  • eski rotation token'ı
  • safe ve unsafe yöntem farkı
  • loopback ve IPv4-mapped loopback yapılandırması