THT DUYURU

Web & Server Güvenliği Doğru web ve veritabanı sunucusu güvenliği sağlanmadan, bilgisayar korsanları hassas verilerinize erişebilir. Web, Sunucu ve veritabanı güvenliğini nasıl sağlayacağınızı buradan öğrenebilirsiniz.

chat
Seçenekler

SQL Injection Hakkında Bilgiler # Cmc[Eagle]

CmcEagle - ait Kullanıcı Resmi (Avatar)
Üye
Üyelik tarihi:
06/2013
Nereden:
Spain
Yaş:
33
Mesajlar:
136
Konular:
111
Teşekkür (Etti):
1
Teşekkür (Aldı):
12
Ticaret:
(0) %
23-06-2013 17:44
#1
SQL Injection Hakkında Bilgiler # Cmc[Eagle]
Örnek bir formumuz olsun:

Kod:
<form action="giris.php" method="POST">  
    <table>  
      <tr><td>Kullanıcıadı</td><input type="text" name="kad"/></td></tr>  
      <tr><td>Parola</td><input type="password" name="parola"/></td></tr>  
      <tr><td></td><td><input type="submit" value="Gir" /></td></tr>  
    </table>  
  </form>
Şimdi bu formu işleyen PHP kodumuza bakalım:
Kod:
<?php  
    $kadi    = $_POST['kad'];  
    $parola = $_POST['parola'];  
    $db->query("SELECT * FROM kullanici WHERE kadi = '$kadi' AND parola = '$parola'");  
  ?>
Kodu fazla detaylandırmadan hemen hatalara bakalım. Kullanıcıdan gelen veriler kontrol edilmede direk veritabanında işleme alındı. En büyük zafiyetlerden birisi bu. Mottomuzu hatırlayalım. Kullanıcıya asla güvenme! Mesela kullanıcı adı kısmına şu yazılsa:

root -- eğer varsa root kullanıcı bilgilerini ekrana dökecekti. SQL de "--" işareti yorum başlangıcını ifade eder. Yani koddaki geri kalan AND parola = '$parola' kısmı artık yok oldu. Ya da şu şekilde bir kod enjekte edilebilir.

Kod:
kullaniciadi = 'osman' OR 1 =1
kullanıcıadı kısmına osman or 1=1 yazılarak tüm kullanıcıların bilgisine ulaşılınabilinir. Pis bir elmayı yıkamadan yemek gibi. Hasta olmamak için önce elmayı yıkamamız gerekli. Öncelikle daha önce belirttiğimiz gibi html filtreleyicileri kullanılmalı:
Kod:
$kad = htmlentities($_POST['kad'], ENT_QUOTES, 'UTF-8');  
  $parola = htmlentities($_POST['parola'], ENT_QUOTES, 'UTF-8');
Daha sonra klasik SQL sınıfları yerine PDO gibi bir sınıf kullanarak (Dilin doğal kütüphanesi olduğu için bunu tercih ediyorum ) veriler veritabanından sorgulanmalı;

Kod:
$query=$db->prepare("SELECT * FROM kullanici WHERE kullaniciadi = :kad AND parola = :parola");  
  $query->bindparam(':kad',$kad,PDO::PARAM_STR);  
  $query->bindparam(':parola',$parola,PDO::PARAM_INT);  
  $query->execute();  
  $kullanici = $query->fetch();
Burada kad bir string ve parola bir integer değer olarak sorgulanıyor. Bunların dışındaki değerler için $query->execute() işlemi gerçekleştirilmiyor. Bu yöntem (prepared statments) sql injection saldırılarını %99 azaltabilir (belki %99,9) fakat diğer bir özelliğide normal sql sorgularına göre hızlı çalışması. Yani güvenliği ön plana çıkaryım derken çoğu zaman performanstan kayıp yaşanır ama ama burada bu iş tersine dönüyor. Bu da SQL injectionu savuşturmada elimizi güçlendiriyor.

Bookmarks


« Önceki Konu | Sonraki Konu »
Seçenekler