Web tabanlı uygulamalarda kullanıcı etkileşiminin temel bileşenlerinden biri olan formlar, veri girişi sağlamanın yanı sıra potansiyel güvenlik açıklarının da kaynağı olabilir. Özellikle kötü niyetli kullanıcılar tarafından manipüle edilen formlar, sistemin bütünlüğünü ve gizliliğini tehdit edebilir. Bu çalışmada, formlar üzerinden oluşabilecek başlıca güvenlik açıkları ve bunlara karşı alınabilecek önlemler incelenmektedir.
SQL Injection, kullanıcı tarafından girilen verilerin doğrudan SQL sorgularına dâhil edilmesi sonucu oluşan bir açıklıktır. Bu açıklık, kötü niyetli bireylerin veritabanına müdahale etmelerine, veri sızdırmalarına veya silmelerine olanak tanır. Bu tür saldırılara karşı en etkili yöntem, hazırlanmış ifadeler (prepared statements) ve ORM yapıları kullanarak kullanıcı girdisinin sorguya doğrudan entegre edilmesini engellemektir.
Örnek:
Kullanıcı adı giriş alanına aşağıdaki gibi bir ifade yazıldığında:
---->' OR '1'='1
bu, sorguyu şu hale getirir:
SELECT * FROM users WHERE username = '' OR '1'='1'
Bu durumda, sorgu koşulu her zaman doğru olur ve sistem tüm kullanıcıları listeleyebilir veya ilk kullanıcıyla oturum açılabilir.
Çözüm:
XSS saldırıları, kullanıcı tarafından girilen JavaScript gibi betiklerin, diğer kullanıcıların tarayıcılarında çalıştırılmasıyla ortaya çıkar. Bu açık, çerez çalma, oturum ele geçirme ve kullanıcıyı yanıltma gibi sonuçlara yol açabilir. Bu tür tehditlere karşı alınabilecek önlemler arasında girdi verilerinin HTML olarak kodlanması, Content Security Policy (CSP) uygulanması ve çıktıların filtrelenmesi yer almaktadır.
Örnek:
Bir yorum formuna şu ifade yazıldığında:
<script>alert('Saldırı Başarılı');</script>
sayfa bu veriyi filtrelemeden gösterirse, script tarayıcıda çalışır.
Çözüm:
CSRF saldırıları, kullanıcının tarayıcısı üzerinden bilgisi dışında yapılan istekler yoluyla sistemde değişiklik yapılmasına olanak tanır. Bu tür saldırılardan korunmak için her formda benzersiz bir CSRF token kullanılması, kullanıcı işlemlerinin doğrulanması ve SameSite çerez politikalarının uygulanması önerilmektedir.
Senaryo:
Kullanıcı giriş yapmışken kötü amaçlı bir siteye girer. Bu site arka planda kullanıcının şifresini değiştiren bir POST isteği gönderebilir. Kullanıcı farkında olmadan bu işlemi kendi hesabı üzerinden yapmış olur.
Çözüm:
Komut enjeksiyonu, form verilerinin sistem komutlarına dahil edilmesiyle, sunucu düzeyinde istenmeyen komutların çalıştırılmasına neden olur. Bu tür saldırıların önüne geçmek için kullanıcı girdileri mutlaka doğrulanmalı, filtrelenmeli ve komut çalıştırmalarında güvenli arayüzler (ör. subprocess yerine exec dışı işlemler) tercih edilmelidir.
Örnek:
os.system("ping " + user_input)
Eğer user_input olarak şu girilirse:
127.0.0.1 && rm -rf /
sistem, potansiyel olarak yıkıcı bir komut çalıştırabilir.
Çözüm:
Dosya yükleme özellikleri, sistemin ele geçirilmesine neden olabilecek ciddi bir zafiyet alanıdır. Zararlı içerikler barındıran veya çalıştırılabilir dosyaların sunucuya yüklenmesiyle istismar gerçekleştirilir. Bu saldırılara karşı alınması gereken önlemler arasında; yalnızca izin verilen dosya türlerinin kabul edilmesi, MIME türü doğrulaması, rastgele dosya isimlendirme ve dosyaların çalıştırılamayacak dizinlerde saklanması yer almaktadır.
Senaryo:
Bir kullanıcı, ".jpg" uzantılı gibi görünen ama aslında çalıştırılabilir ".php" içeren bir dosyayı yükler:
---->evil.php.jpg
Sunucu bu dosyayı doğrulamazsa veya çalıştırılabilir bir klasöre koyarsa, saldırgan siteye erişim sağlayabilir.
Çözüm:
Formlar aracılığıyla yapılan kimlik doğrulama işlemleri, zayıf uygulandığında kullanıcı taklidi veya hesap ele geçirme gibi riskler doğurabilir. Bu nedenle; sunucu taraflı girdi doğrulaması, şifrelerin güvenli algoritmalarla (örn. Argon2, bcrypt) hash'lenmesi, iki faktörlü kimlik doğrulama (2FA) ve kullanıcı başına erişim sınırlamaları gibi yöntemler uygulanmalıdır.
Örnek:
Şifreler veritabanında düz metin olarak saklanırsa, veritabanı sızıntısında tüm hesaplar açık hâle gelir.
Çözüm:
1. SQL Injection (SQL Enjeksiyonu)
SQL Injection, kullanıcı tarafından girilen verilerin doğrudan SQL sorgularına dâhil edilmesi sonucu oluşan bir açıklıktır. Bu açıklık, kötü niyetli bireylerin veritabanına müdahale etmelerine, veri sızdırmalarına veya silmelerine olanak tanır. Bu tür saldırılara karşı en etkili yöntem, hazırlanmış ifadeler (prepared statements) ve ORM yapıları kullanarak kullanıcı girdisinin sorguya doğrudan entegre edilmesini engellemektir.
Örnek:
Kullanıcı adı giriş alanına aşağıdaki gibi bir ifade yazıldığında:
---->' OR '1'='1
bu, sorguyu şu hale getirir:
SELECT * FROM users WHERE username = '' OR '1'='1'
Bu durumda, sorgu koşulu her zaman doğru olur ve sistem tüm kullanıcıları listeleyebilir veya ilk kullanıcıyla oturum açılabilir.
Çözüm:
- Hazırlanmış ifadeler (prepared statements) kullanılmalı.
- ORM yapıları tercih edilmeli.
- Girdi verisi doğrudan sorguya dâhil edilmemeli.
2. XSS (Cross-Site Scripting)
XSS saldırıları, kullanıcı tarafından girilen JavaScript gibi betiklerin, diğer kullanıcıların tarayıcılarında çalıştırılmasıyla ortaya çıkar. Bu açık, çerez çalma, oturum ele geçirme ve kullanıcıyı yanıltma gibi sonuçlara yol açabilir. Bu tür tehditlere karşı alınabilecek önlemler arasında girdi verilerinin HTML olarak kodlanması, Content Security Policy (CSP) uygulanması ve çıktıların filtrelenmesi yer almaktadır.
Örnek:
Bir yorum formuna şu ifade yazıldığında:
<script>alert('Saldırı Başarılı');</script>
sayfa bu veriyi filtrelemeden gösterirse, script tarayıcıda çalışır.
Çözüm:
- HTML entity encoding (örneğin < → &lt; ) yapılmalı.
- Content-Security-Policy başlığı uygulanmalı.
- Girdi verisi hem sunucu hem istemci tarafında doğrulanmalı.
3. CSRF (Cross-Site Request Forgery)
CSRF saldırıları, kullanıcının tarayıcısı üzerinden bilgisi dışında yapılan istekler yoluyla sistemde değişiklik yapılmasına olanak tanır. Bu tür saldırılardan korunmak için her formda benzersiz bir CSRF token kullanılması, kullanıcı işlemlerinin doğrulanması ve SameSite çerez politikalarının uygulanması önerilmektedir.
Senaryo:
Kullanıcı giriş yapmışken kötü amaçlı bir siteye girer. Bu site arka planda kullanıcının şifresini değiştiren bir POST isteği gönderebilir. Kullanıcı farkında olmadan bu işlemi kendi hesabı üzerinden yapmış olur.
Çözüm:
- Formlara benzersiz CSRF token eklenmeli.
- SameSite cookie politikası yapılandırılmalı.
- Hassas işlemler kullanıcıdan tekrar kimlik doğrulama istemeli.
4. Komut Enjeksiyonu (Command Injection)
Komut enjeksiyonu, form verilerinin sistem komutlarına dahil edilmesiyle, sunucu düzeyinde istenmeyen komutların çalıştırılmasına neden olur. Bu tür saldırıların önüne geçmek için kullanıcı girdileri mutlaka doğrulanmalı, filtrelenmeli ve komut çalıştırmalarında güvenli arayüzler (ör. subprocess yerine exec dışı işlemler) tercih edilmelidir.
Örnek:
os.system("ping " + user_input)
Eğer user_input olarak şu girilirse:
127.0.0.1 && rm -rf /
sistem, potansiyel olarak yıkıcı bir komut çalıştırabilir.
Çözüm:
- subprocess.run() gibi güvenli komut çalıştırma yöntemleri kullanılmalı.
- Girdiler sıkı biçimde doğrulanmalı (örneğin regex ile IP adresi kontrolü).
5. Dosya Yükleme Açıkları
Dosya yükleme özellikleri, sistemin ele geçirilmesine neden olabilecek ciddi bir zafiyet alanıdır. Zararlı içerikler barındıran veya çalıştırılabilir dosyaların sunucuya yüklenmesiyle istismar gerçekleştirilir. Bu saldırılara karşı alınması gereken önlemler arasında; yalnızca izin verilen dosya türlerinin kabul edilmesi, MIME türü doğrulaması, rastgele dosya isimlendirme ve dosyaların çalıştırılamayacak dizinlerde saklanması yer almaktadır.
Senaryo:
Bir kullanıcı, ".jpg" uzantılı gibi görünen ama aslında çalıştırılabilir ".php" içeren bir dosyayı yükler:
---->evil.php.jpg
Sunucu bu dosyayı doğrulamazsa veya çalıştırılabilir bir klasöre koyarsa, saldırgan siteye erişim sağlayabilir.
Çözüm:
- Yalnızca izin verilen MIME türleri ve uzantılar kabul edilmeli.
- Dosyalar rastgele isimlendirilip çalıştırılamayan dizinlere kaydedilmeli.
- Sunucu tarafında ek doğrulamalar yapılmalı (örneğin getimagesize() ile resim doğrulama).
6. Kimlik Doğrulama ve Girdi Doğrulama Hataları
Formlar aracılığıyla yapılan kimlik doğrulama işlemleri, zayıf uygulandığında kullanıcı taklidi veya hesap ele geçirme gibi riskler doğurabilir. Bu nedenle; sunucu taraflı girdi doğrulaması, şifrelerin güvenli algoritmalarla (örn. Argon2, bcrypt) hash'lenmesi, iki faktörlü kimlik doğrulama (2FA) ve kullanıcı başına erişim sınırlamaları gibi yöntemler uygulanmalıdır.
Örnek:
Şifreler veritabanında düz metin olarak saklanırsa, veritabanı sızıntısında tüm hesaplar açık hâle gelir.
Çözüm:
- Şifreler bcrypt, Argon2 gibi algoritmalarla hash’lenmeli.
- 2FA (İki faktörlü kimlik doğrulama) uygulanmalı.
- Oturumlar Secure, HttpOnly ve SameSite özellikleri ile korunmalı.
Ek Güvenlik Önlemleri
- Tüm iletişimlerde HTTPS protokolü kullanılmalıdır.
- Oturum yönetiminde Secure, HttpOnly ve SameSite cookie ayarları yapılandırılmalıdır.
- Uygulama, düzenli aralıklarla penetrasyon testlerine tabi tutulmalı, OWASP ZAP, Burp Suite gibi güvenlik tarama araçları ile denetlenmelidir.

