SQL Injection Nedir ve Nasıl Önlenir? (PHP)

 

Merhaba dostlar bugün sizinle SQL injection‘ın ne olduğu ve nasıl önlenebileceği hakkında konuşacağız. Hemen başlayalım.

SQL (Structured Query Language) bildiğiniz gibi veritabanlarını yönetmede kullanılan bir dildir. SQL dili ile sorgular yazılır ve veritabanında istenilen bilgiler değiştirilebilir, okunabilir, baştan oluşturulabilir veya silinebilir.

SQL injection ise bu sorgulara müdahale etmektir, istenmeyen sorgulara açık verildiğinde kötü niyetli bir yazılımcı açıkları kullarak veritabanınızda değişiklikler yapabilir hatta tamamen silebilir.

Genelde SQL injection, kullanıcıya bir giriş yapması istendiği durumlarda ortaya çıkar. Örneğin kullanıcı adı ve şifre isteyeceğiz, normalde alınan verileri veritabanındaki verilerle kontrol ederek (kullanıcıdan alınan bilgiler ile veritabanındaki bilgileri sorgular ile kontrol ediyoruz) geri döndürmek amacımız ama eğer önlemini almazsak kullanıcı adı ve şifre yerine sorgumuzu bozarak bilgilerimizin güvenliğini tehtid edebilecek kodların yazılmasına izin vermiş oluyoruz.

SQL injection mantığını biraz anladıktan sonra nasıl önleyebileceğimize geçelim şimdi.

Hazır ifadeler (prepared statements) kullanarak kötü niyetli SQL kodlarının önüne geçebiliriz. Hazır ifadeler; veritabanı sunucusunda diğer bütün parametrelerden ayrı bir şekilde gönderilen ve çözümlenen SQL parametreleridir.

Hazır ifade kullanabilmek için iki yöntem mevcut, şimdi bunlara bakalım dostlar.

1. PDO (PHP Data Object) kullanmak:

1
2
3
4
5
6
7
8
$stmt = $pdo->prepare('SELECT * FROM books WHERE name = :name');

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

foreach ($stmt as $row){

//aldığınız $row ile istediğinizi yapabilirsiniz.
}

Bu yöntemi, PDO destekleyen herhangi bir veritabanı için kullanabilirsiniz, örneğin: MySQL, MsSQL, Firebird, PostgreSQL, SQLite gibi.

2. MySQLi kullanmak:

1
2
3
4
5
6
7
8
9
10
$stmt = $dbConnection->prepare('SELECT * FROM books WHERE name = ?');
$stmt->bind_param('s', $name); //'s' string tipi için belirlenmiştir.

$stmt->execute();

$result = $stmt->get_result();
while ($row = $result->fetch_assoc()){

//yine $row u aldıktan sonra veri ile istediğinizi yapabilirsiniz.
}

Bu yöntem yalnızca MySQL veritabanı için çalışacaktır. Eğer projenize MySQL veritabanı ile başladıysanız ve ileride de değiştirmeyi düşünmüyorsanız bu yöntem ile SQl injection’dan korunabilirsiniz.

Evet dostlar bugün backend programlama dili olarak PHP kullandığımızda SQL injection’dan nasıl korunabileceğimizi konuştuk. Gayet önemli bir konu olduğu için PDO veya MySQLi yöntemlerinden birini kullanmanızı kesinlikle öneriyorum. Dikkat edin kendinize.

ahmet

Ahmet Kılınç - Software Developer

Bunlar da hoşunuza gidebilir...

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

This site uses Akismet to reduce spam. Learn how your comment data is processed.