Konu Anlatımı
Web Güvenliği Neden Temel Konudur?
Bir web uygulaması, kullanıcının tarayıcısı ile sunucu arasında sürekli veri alışverişi yapar. Bu alışverişin iki tarafı da güvenilmez sayılabilir; kullanıcının tarayıcısındaki sayfa içeriği değiştirilmiş olabilir, gelen istek de elde geçirilmiş olabilir. Bu nedenle güvenlik, dışarıdan gelen her değerin doğrulanması ve her işlemin yetkilendirilmesi ilkesine dayanır.
Güvenlik açıklarının çoğu, veriyi doğrulamanın yerine güvenme hatasından kaynaklanır. Uygulama kullanıcının ne gönderdiğini denetlemez, veriyi olduğu gibi sorguya ya da sayfaya aktarır. Saldırgan da tam olarak bu açığı kullanır.
Sorguya Gömülen Girdi ve SQL Enjeksiyonu
Kullanıcıdan gelen bir metin, veri tabanı komutuna doğrudan eklenirse saldırgan komutun yapısını değiştirebilir. Buna sorgu enjeksiyonu denir. Saldırgan, aranan koşulun yerine kendi koşulunu yazarak tüm tabloyu okuyabilir, veri silebilir ya da yetkisi dışında kayıt ekleyebilir.
Çözüm hazırlanmış sorgu kullanmaktır. Hazırlanmış sorguda komutun yapısı ile veri ayrı gönderilir; veri bir değer olarak işlenir, komut parçası olarak yorumlanmaz. Girdi türü ve biçimi yine de doğrulanmalıdır, ancak değer doğrulaması tek başına yeterli bir güvenlik önlemi değildir. Sıralama ve tablo adı gibi yapısal bölümler izinli listeden seçilmelidir.
Betik Enjeksiyonu ve Sahte İstek Saldırısı
Betik enjeksiyonu, kullanıcı girdisinin tarayıcıda sayfa içeriği olarak yorumlanmasıyla gerçekleşir. Zararlı betik, kurbanın oturumuyla çalışır ve form verisi çalınabilir. Önlem olarak veri ekrana yazılırken kaçış işlemi uygulanır, kullanıcı girdisi hiçbir zaman doğrudan biçimlendirme olarak kullanılmaz. Güvenliği sağlayan tek bir yöntem değil, verinin tüm noktalarda doğru şekilde kodlanmasıdır.
Sahte istek saldırısı ise kurbanın tarayıcısı, kurbanın niyeti olmadan kimliğiyle bir istek gönderir. Kullanıcının gönderdiği formlara gizli ve tahmin edilemeyen bir jeton eklenerek bu istekler ayırt edilir. Oturum çerezine yalnızca yazma ve aynı site kısıtı gibi bayraklar eklemek de önlem olarak kullanılır.
- Her kullanıcı girdisi yazılmadan önce biçim ve sınır denetiminden geçirilir.
- Hataların ayrıntısı kullanıcıya gösterilmez, ayrıntılı kayıt sunucu günlüğüne yazılır.
- Yetkilendirme her istekte sunucu tarafında yeniden denetlenir, arayüzde gizlenen düğme koruma sağlamaz.
- Kullanıcının erişebileceği verilerin yalnızca kendi kayıtlarıyla sınırlanmasına özen gösterilir.
Aktarım Güvenliği, Parola Saklama ve Anahtarlar
Parolalar düz metin olarak saklanırsa veritabanına erişen biri tüm hesapları ele geçirir. Bu nedenle parolalar tek yönlü bir karma işlemiyle saklanır ve karşılaştırma, kullanıcının girdisi aynı işlemden geçirilerek yapılır. Karma işlemi ile her hesap için farklı bir tuz birleştirilir; tuz veritabanında saklansa bile aynı parolanın farklı hesaplardaki karmaları farklı olur, bu da toplu çözümlemeyi zorlaştırır.
Aktarım sırasında bağlantının şifrelenmesi, aradaki ağdan verinin okunmasını engeller. Erişim anahtarları ve veri tabanı parolaları kaynak koda yazılmaz, ortam ayarlarından veya ayrı bir anahtar yönetiminden alınır. Anahtar değişimlerinin kaydı tutulur ve eski anahtarların kullanımı durdurulur.
Erişim Denetimi ve En Az Yetki
En az yetki ilkesi, her kullanıcıya veya servise yalnızca görevini yapabilmesi için gereken en küçük yetkiyi vermektir. Bir öğrenci yalnızca kendi kayıtlarını görmeli, bir öğretmen yalnızca kendi sınıfını görmelidir. Yetkiler tek tek denetlenmeli, gizli bir bağlantı ya da tahmin edilen bir adresle erişim sağlanmamalıdır.
Güvenlik önlemleri tek tek zayıf olabilir; bu nedenle katmanlı bir yapı kurulur. Girdi doğrulama, hazırlanmış sorgu, en az yetki, şifreli aktarım, sınırlı deneme, hata günlüğü ve düzenli yama birlikte çalışır. Önlemlerden biri atlandığında diğerleri riski azaltır ama tamamen ortadan kaldırmaz.
Ne Öğreneceğiz
Girdi doğrulama, hazırlanmış sorgular, betik enjeksiyonu, sahte istek ve parola güvenliği tekniklerini uygulayarak web uygulamalarındaki riskleri azaltır. Bu konuda ögrenme çıktıları:
- Sorguya gömülen kullanıcı girdisinin doğrulanması gerekliliğini açıklar.
- Hazırlanmış sorgu ile değer birleştirmenin güvenlik farkını karşılaştırır.
- Betik enjeksiyonu ve sahte istek saldırılarını tanıyıp önlem seçer.
- Parola saklamada karma ve tuz kullanımının rolünü hesapla değerlendirir.
- En az yetki, çerez bayrakları ve hata mesajı gizleme kurallarını uygular.
Ön Bilgi
Bu konuya başlamadan önce temel kavram ve ön koşulları kavramanız yardımcı olacaktır. Konunun çerçevesinde şu kavramlar dikkat ister:
- Değer doğrulaması tek başına yeterli değildir; sorgu yapısı ile veri ayrılmalıdır.
- Hazırlanmış sorguda veri komut parçası olarak yorumlanmaz.
- Tarayıcıya gönderilen her veri, çıktı bağlamına göre kaçış işleminden geçirilmelidir.
- Sahte istek saldırısına karşı formlara tahmin edilemeyen jeton eklenmelidir.
- Parola düz metin saklanmaz; tek yönlü karma ve hesaba özel tuz kullanılır.
- Arayüzde gizlenen düğme veya bağlantı güvenlik önlemi değildir.
- Hata ayrıntıları kullanıcıya gösterilmez, sunucu günlüğüne yazılır.
Basit Örnek ve Günlük Yaşam
Günlük yaşamda ve mesleki bağlamda bir uygulama:
Soru: Ad ve soyad alanları sorguya değer birleştirme ile ekleniyor. Kullanıcı arama kutusuna tırnak işareti yazarak sorgu yapısını bozabiliyor.
- Girdinin hangi değer olarak ayrılacağını belirle.
- Komut yapısını sabitle, veriyi ayrı gönder.
- Girdi biçimini ve uzunluğunu yine de doğrula.
- Hatalı girdi kaydını güvenlik günlüğüne yaz.
Sonuç/cevap: Sorgu hazırlanır, komut yapısı veri alındıktan sonra kesinleşir ve değerler ayrı parametre olarak gönderilir. Böylece tırnak işareti bir komut başlatmaz, yalnızca bir metin karakteri olarak işlenir.
İleri Örnek
Daha ileri bir uygulama:
Soru: Kullanıcı girdisi içeren 15 sorgudan 3'ünde hazırlanmış sorgu yerine değer birleştirme kullanılmıştır.
- Güvensiz sorgu sayısını belirle.
- Toplam sorgu sayısına böl.
- Sonucu yüzde olarak ifade et.
Sonuç/cevap: 3 / 15 = 0,2 çıkar, yani sorguların yüzde 20'si güvenlik açığı taşımaktadır. Her biri hazırlanmış sorguya dönüştürülüp dönüşüm sonrası sınama ile doğrulanmalıdır.
Adım Adım Çözülmüş Örnek
Hazırlanmış sorguya dönüştürme konusunun adımları:
- Girdinin hangi değer olarak ayrılacağını belirle.
- Komut yapısını sabitle, veriyi ayrı gönder.
- Girdi biçimini ve uzunluğunu yine de doğrula.
- Hatalı girdi kaydını güvenlik günlüğüne yaz.
Karşılaştırma Tablosu
| Kavram | Açıklama |
|---|
| Değer doğrulaması tek başına yeterli değ | Değer doğrulaması tek başına yeterli değildir; sorgu yapısı ile veri ayrılmalıdır. |
| Hazırlanmış sorguda veri komut parçası o | Hazırlanmış sorguda veri komut parçası olarak yorumlanmaz. |
| Tarayıcıya gönderilen her veri, çıktı ba | Tarayıcıya gönderilen her veri, çıktı bağlamına göre kaçış işleminden geçirilmelidir. |
| Sahte istek saldırısına karşı formlara t | Sahte istek saldırısına karşı formlara tahmin edilemeyen jeton eklenmelidir. |
| Parola düz metin saklanmaz; tek yönlü ka | Parola düz metin saklanmaz; tek yönlü karma ve hesaba özel tuz kullanılır. |
| Arayüzde gizlenen düğme veya bağlantı gü | Arayüzde gizlenen düğme veya bağlantı güvenlik önlemi değildir. |
| Hata ayrıntıları kullanıcıya gösterilmez | Hata ayrıntıları kullanıcıya gösterilmez, sunucu günlüğüne yazılır. |
Sık Yapılan Hatalar
Yalnızca uzunluk kontrolü yapmak: Uzunluğu doğru gelen bir metin yine komut yapısını bozabilir; doğrulama yapısal ayrımın yerini tutmaz, sorgu hazırlanmalıdır.
Girdiyi kaçırmak yerine silmek: Değerlerin tümünü reddetmek yerine tasarıma uygun hata mesajı gösterilmeli, kayıp veri önlenmelidir.
Hata ayrıntısını kullanıcıya göstermek: Veri tabanı yapısını ya da dosya yolunu açığa çıkaran hata mesajı saldırıya yol haritası verir.
Arayüzde gizlemeyi güvenlik saymak: Butonu gizlemek erişimi engellemez; her istek sunucu tarafında yetkiye göre yeniden değerlendirilmelidir.
Tuzu gizli tutmaya çalışmak: Tuzun gizlenmesi gerekmez, gizliliği değil benzersizliği sağlar; yanlış saklama yöntemi güvenliği bozar.
Özet
Web güvenliği, dışarıdan gelen her verinin doğrulanması ve her işlemin yetkilendirilmesiyle sağlanır. Sorguya gömülen kullanıcı girdisi komut yapısını değiştirip tüm veriyi ele geçirebileceğinden hazırlanmış sorgu kullanılmalı, veri yapıdan ayrılmalıdır. Betik enjeksiyonunda çıktı bağlamına göre kaçış işlemi uygulanır, sahte istek saldırısında formlara tahmin edilemeyen jeton eklenir ve çerez bayrakları kullanılır. Parolalar düz metin saklanmaz, tek yönlü karma ile hesaba özel tuz kullanılarak saklanır. Sayısal değerlerle ölçüm yapılabilir: 8 karakterlik ve 62 karakterlik kümede bilgi miktarı 8 × log2(62) = 47,6 bit bulunur, 6,4 milyar parolalık uzayda saniyede 500 denemeyle ortalama süre 6400000000 / 500 = 12800000 saniye, yani 3555,6 saattir. 12 denemelik sınır 10000 olası parolada yalnızca 12 / 10000 = 0,0012 yani yüzde 0,12 oranında koruma sağlar; bu yüzden sınır, gecikme ve en az yetki birlikte kullanılmalıdır.
Kendini Dene
Soru: Yönerge: Bir öğrenci kayıt sisteminde kullanıcı adı ve parola ile giriş yapılıyor. (I) sorgu enjeksiyonuna karşı alınacak önlemleri, (II) parola saklamada kullanılacak yöntemi, (III) giriş formunda deneme saldırılarına karşı uygulanacak önlemleri, (IV) her önlemin hangi saldırıyı engellediğini madde madde açıkla.
Örnek cevap: Puanlama anahtarı: Sorgu enjeksiyonu önlemlerinin sayılması 6 puan; parola saklama yönteminin doğru anlatılması 6 puan; deneme saldırısına karşı en az üç önlemin yazılması 7 puan; önlemlerin saldırı türleriyle eşleştirilmesi 6 puan. Toplam 25 puan. Model cevap: Tüm sorgular hazırlanmış sorguya dönüştürülür, yapısal bölümler izinli listeden seçilir ve girişler biçim ve uzunluk açısından doğrulanır. Parolalar tek yönlü karma ile hesaba özel tuz eklenerek saklanır, karşılaştırma aynı işlemden geçirilerek yapılır. Giriş formunda deneme sınırı, başarısız denemelerde gecikme, çok sayıda hatalı deneme sonrası hesabı geçici olarak kilitleme ve güvenlik uyarısı uygulanır. Böylece komut yapısı değiştirilemez, parolalar ele geçse bile okunamaz ve otomatik denemeler yavaşlatılır.