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.comhttps://dashboard.example.com:8443http://dashboard.example.com
Production URL doğrulaması
1.1.0 production profilinde şu adresleri reddeder:
- HTTPS kullanmayan app URL ve origin
localhostve*.localhost127.0.0.0/80.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.
Header ve cookie düzeni
Ö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/httpsfarkı- 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ı