Php SQL Injection Saldırılarından Nasıl Korunurum?
Çoğu Php SQL kullanıcısının başı Injection Saldırıları ve ataklarıdır. Ancak bunlardan korunmanın yolları da mevcut. Bunları size en anlatabileceğimiz en kolay şekliyle aktarmaya çalıştık. Buyurun örneklerle bu savunma nasıl yapılır hep beraber anlamaya çalışalım.
Şöyle bir örnekle giriş yapmak istiyorum. Diyelim ki ben aşağıdaki gibi bir kod yazacağım ancak bu durumda kesinlikle kullanıcı verisini sql içine yerleştirdiğimde, Sql Injection saldırıları gelecektir.
$guvensiz_veri = $_POST ['kullanici_verisi]; mysql_soru("INSERT INTO tablo (kolon) VALUES ('" . $guvensiz_veri . "')");
Ancak kullanıcıdan veri aldığım yere kullanıcı aşağıdaki gibi bir kod girer ise
değer'); DROP TABLE tablo;--,
Sql sorgusu şu şekilde değişir
INSERT INTO tablo (kolon) VALUES('değer'); DROP TABLE tablo;--')
Bu gibi bir durumda Php’de sql Injection’a maruz kalacağız. İşte bu gibi durumlarda ne yapabiliriz? Doğru hamle nedir? Açıklayalım…
Php’de Sql Injection dan korunmak için
Hazırlanmış özel ve hazır ifadeler ve parametreli sorgular kullanın.
Temel olarak iki seçeneğiniz var. 1.si PDO kullanarak 2.si ise mysqli kullanma yöntemleri.
- PDO kullanarak
$stmt = $pdo->prepare('SELECT * FROM Kisiler WHERE Ad = :ad'); $stmt->execute(array(':ad'=> $ad));foreach($stmt as $row){// $row ile bir şeyler yap.}
- mysqli kullanarak
$stmt = $dbConnection->prepare('SELECT * FROM Kisiler WHERE Ad = ?'); $stmt->bind_param('s', $ad); $stmt->execute(); $sonuc = $stmt->get_result();while($row = $sonuc->fetch_assoc()){// $row ile bir şeyler yap.}
Bu iki yöntem dışında şöyle bir bilgi de verelim.
$guvensiz_veri = addslashes($_POST[‘kullanici_verisi]);
mysql_ söz dizimlerini kullanarak yazıyorsak direk “addslashes” fonksiyonunu da kullanman mümkün sıkıntı çıkmaz.
Ve son olarak ‘” tarzı özel karakterlerin başına slash yani “/” koyarsak mysql kayıt ederken de eklediği slash “/” ları siler ve böylelikle çok düzgün bir kayıt yapmış oluruz.