Dostlar, selam. Bugün eski bir projemi, kendi yazdığım oyun sunucumu bakım için açtım. Amacım basit bir özellik eklemekti. Ama öyle bir şey gördüm ki, şu an klavyeme bakarken yüzüm kızarıyor. Eski query'lerime baktım ve hepsi, dümdüz string birleştirme ile çalışıyordu. Kullanıcı adı, şifre, item ID'si... Hepsi direk query string'inin içine ekleniyordu. mysql_query() veya mysqli ile. Kafayı yiyecektim resmen.
PHP:
$query = "SELECT FROM users WHERE username='" . $username . "' AND password='" . $password . "'";
Yukarıdaki kodu görünce kalbim durdu. Meğer yıllarca, kendi sunucumda, tam bir SQL injection açığı cenneti yaratıyormuşum. Ve bunun farkında bile değilmişim. "Zaten kullanıcılar güvenilir" diye düşünmek en büyük hataymış.
Geçen ay, bir gün canım sıkıldı ve "Acaba sunucuyu nasıl daha güvenli yaparım?" diye düşündüm. Araştırmalarım beni PDO ve Prepared Statement'a götürdü. İlk başta, "Bu kadar uğraşmaya değer mi?" dedim. Ama sonra basit bir test yaptım ve gördüm ki, eski yöntemle yazdığım login sistemine özel karakterlerle saldırı simüle edebiliyordum. İşte o an her şey değişti.
Yeni sistemi kurmak aslında çok kolaydı. Sadece alışmak biraz zaman aldı. Artık tüm veritabanı işlemlerim böyle:
PHP:
$stmt = $pdo->prepare("SELECT FROM users WHERE username = :username AND password = :pass");
$stmt->execute(['username' => $username, 'pass' => $hashedPassword]);
Parametreler query'den ayrıldığı için, kullanıcıdan gelen veri ne olursa olsun, artık sadece bir veri olarak kalıyor. Sihir gibi bir şey. mysqli_real_escape_string() ile uğraşmaktan da kurtuldum.
Asıl soru bu. StackOverflow'da bile her yerde "USE PREPARED STATEMENTS!" diye bağırıyorlar. Ama ben, "Küçük proje işte, gerek yok" mantığıyla yıllarca bu açığı taşımışım. Şaka gibi ama gerçek. Güvenlik, "sonra hallederim" dediğiniz an sizi vuruyor.
Şimdi eski koda bakınca, o query'leri görmek beni gerçekten ürkütüyor. Tüylerim diken diken oluyor. Siz de eski projelerinize bir göz atın derim. Belki siz de benim gibi, farkında olmadan büyük riskler almışsınızdır.
Peki ya siz? Hiç eski bir kodunuza bakıp "Ben bunu nasıl yazmışım?" dediğiniz oldu mu? Prepared Statement dışında, benzer "keşke daha erken öğrenseydim" dediğiniz güvenlik önlemleri var mı?