Ana içeriğe geç

CSRF

Siteler Arası İstek Sahteciliği (Cross-Site Request Forgery)

Okunuşu
sisörf ya da si-es-ar-ef
Güncellendi 2 dk okuma

Bu sayfayı paylaşın

Bağlantıyı gönderin, tanımı bağlantısıyla birlikte alıntılayın ya da kendi sitenizde bir kart olarak gösterin.

https://softwaredictionary.org/tr/terimler/csrf

Kısaca

CSRF, oturum açmış kullanıcının tarayıcısını güvenilir bir siteye istenmeyen istek göndermeye kandıran, sitenin de gerçek kullanıcı eylemi sandığı saldırıdır.

CSRF nedir?

Cross-site request forgery, tarayıcıların çerezleri isteklere otomatik olarak eklemesinden yararlanır. Bankanızda oturum açmışken kötü amaçlı bir sayfayı ziyaret ederseniz, bu sayfa arka planda bankaya bir form gönderebilir; tarayıcınız oturum çerezinizi isteğe ekler ve banka, sizden gelmiş meşru bir istek görür.

Saldırgan yanıtı asla görmez ve parolanızı öğrenmez; yalnızca sitenin e-posta adresini değiştirmek, para transfer etmek veya veri silmek gibi bir eylemi gerçekleştirmesini sağlar. CSRF'in yalnızca veri okuyan isteklere değil, durumu değiştiren isteklere odaklanmasının nedeni budur.

Başlıca savunmalar anti-CSRF token'ları ve SameSite çerezleridir. CSRF token'ı, sunucunun kendi formlarına gömdüğü ve durumu değiştiren her istekte doğruladığı, rastgele ve tahmin edilemez bir değerdir; üçüncü taraf bir site bunu bilemez. Oturum çerezlerini SameSite=Lax veya SameSite=Strict olarak ayarlamak, tarayıcıların çerezleri çoğu siteler arası istekte göndermesini engeller; Origin başlığını kontrol etmek ise bir katman daha ekler.

GET isteklerinin yan etkisiz tutulması da önemlidir; çünkü bağlantılar ve görseller bu istekleri her yerden tetikleyebilir. Çerez yerine Authorization başlığında token ile kimlik doğrulayan API'ler, tarayıcılar bu başlığı asla otomatik eklemediği için genellikle CSRF'e açık değildir. CSRF, XSS'ten farklıdır: CSRF başka bir siteden sahte istek gönderir, XSS ise saldırganın kodunu hedef sitenin içinde çalıştırır.

Bir bakışta

Siteler arası istek sahteciliği. Kullanıcı bank.example'a giriş yapar; site bir oturum çerezi bırakır. Daha sonra kullanıcı evil.example'da, bank.example/transfer adresine giden gizli bir form içeren bir sayfa açar. Tarayıcı formu gönderir ve bankanın oturum çerezini kendiliğinden ekler; bu yüzden koruma yoksa banka geçerli, giriş yapılmış bir istek görür. SameSite çerezler ve CSRF token'ları bankanın bu isteği reddetmesini sağlar.Tarayıcıevil.examplebank.examplegiriş yapSet-Cookie: session=…daha sonra, başka bir sekmedebir sayfa açgizli form içeren sayfaPOST /transfer · Cookie: session=…tarayıcı bankanın çerezini kendiliğinden eklerkullanıcı gibi görünürSavunma: SameSite çerezler ve bir CSRF token'ı; sahte istek reddedilir
Saldırgan çerezi hiç görmez; çerezi tarayıcı kendiliğinden ekler. Savunmalar, isteğin gerçekten bankanın kendi sayfalarından geldiğinden emin olur.

Önemli noktalar

  • CSRF, tarayıcıların otomatik gönderdiği çerezlerden yararlanır.
  • Veri okumayı değil, durumu değiştiren eylemleri hedefler.
  • Anti-CSRF token'ları, isteğin gerçek sitenin kendi sayfalarından geldiğini kanıtlar.
  • SameSite çerezler, siteler arası çerez gönderiminin çoğunu engeller.
  • GET istekleri asla veriyi değiştirmemelidir.

Örnek

Savunmasız ve korumalı form işleyici (Express)javascript
// Vulnerable: any website can submit this form on the user's behalf
app.post("/email", requireLogin, (req, res) => {
  updateEmail(req.user, req.body.email);
  res.sendStatus(204);
});

// Protected: require a secret token that only our own form contains
app.post("/email", requireLogin, (req, res) => {
  if (req.body.csrfToken !== req.session.csrfToken) {
    return res.status(403).send("Invalid CSRF token");
  }
  updateEmail(req.user, req.body.email);
  res.sendStatus(204);
});

Sık sorulan sorular

CSRF ile XSS arasındaki fark nedir?

CSRF, kullanıcının tarayıcısının farklı ve kötü amaçlı bir siteden güvenilir bir siteye istek göndermesini sağlar; XSS ise betiği güvenilir sitenin içinde çalıştırır. Enjekte edilen betik çoğu CSRF korumasını aşabileceğinden XSS genellikle daha tehlikelidir.

SameSite çerezleri CSRF'i engeller mi?

SameSite=Lax veya SameSite=Strict, çerezleri siteler arası isteklerde göndermeyerek çoğu CSRF saldırısını engeller; bazı tarayıcılar bu özniteliği olmayan çerezleri varsayılan olarak Lax sayar. Yine de derinlemesine savunma için CSRF token'ları ya da Origin kontrolleriyle birlikte kullanılması önerilir.

JWT tabanlı API'lerin CSRF korumasına ihtiyacı var mı?

Token bir çerezde saklanıyorsa evet; çünkü tarayıcı onu otomatik gönderir. Token bir Authorization başlığında elle gönderiliyorsa CSRF genellikle sorun olmaz, ancak bu durumda token'ın XSS'e karşı korunması gerekir.

Sık karşılaştırılanlar

İlgili sayfalar

Kaynaklar

Bu sayfada bir hata ya da eksik mi gördünüz?Düzeltme önerin

Daha fazla

Ayarlar