PHP'de SQL Injection nasıl önleyebilirim?

PHP'de SQL Injection nasıl önleyebilirim?
SQL Injection, Web uygulamalarında kullanıcılar tarafından SQL sorgularına dışarıdan müdahalede bulunularak veri tabanı üzerinde işlem yapılmasıdır. SQL Injection, bir sistem açığı olarak nitelendirilebilir. Bu açık saldırganların sisteminizden bilgi çalabilmesine, sistemde değişiklik yapabilmesine, sisteminizi ele geçirmesine veya kullanılamaz hale getirmesine yardımcı olur.
Eğer kullanıcı girdisi bir SQL sorgusuna değiştirilmeden eklenirse, uygulama aşağıdaki örnekte olduğu gibi SQL enjeksiyonuna karşı savunmasız hale gelir:

$unsafe_variable = $_POST['user_input']; 

mysql_query
("INSERT INTO `table` (`column`) VALUES ('$unsafe_variable')");

Çünkü kullanıcı sorguya value’); DROP TABLE table;– gibi bir ifade ekleyebilir ve sorgu şu hale gelebilir:

INSERT INTO `table` (`column`) VALUES('value'); DROP TABLE table;--')

PHP’de SQL Injection’ı önlemek için neler yapılabilir?

PHP’de bu durumu aşmak için hazır ifadeler ve parametreli sorgular kullanılır. Bunlar, veritabanı sunucusu tarafından herhangi bir parametreden ayrı olarak gönderilen ve ayrıştırılan SQL ifadeleridir. Bu şekilde bir saldırganın zararlı SQL’i enjekte etmesi imkansızdır. 
Temel olarak bunu önlemek için iki seçeneğiniz var:
1) PDO’yu kullanma (desteklenen herhangi bir veritabanı sürücüsü için):
$stmt = $pdo->prepare('SELECT * FROM personel WHERE isim = :isim');

$stmt
->execute(array('isim' => $isim));

foreach ($stmt as $row) {
// işlemler
}
2) MySQLi’yi Kullanma (MySQL için):
 $stmt = $dbConnection->prepare(‘SELECT * FROM personel WHERE isim = ?’);
$stmt->bind_param('s', $isim); // 's' string tipini belirtir

$stmt
->execute();

$result
= $stmt->get_result();
while ($row = $result->fetch_assoc()) {
// işlemler
}

PHP’de MySQL dışında bir veritabanına bağlanıyorsanız, başvurabileceğiniz sürücüye özgü ikinci bir seçenek vardır (örneğin, pg_prepare () ve PostgreSQL için pg_execute ()). PDO(PHP Data Objects) evrensel bir seçenektir.

Share

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir