Total Users Online: 0 üye, 324 guest | Tarih/Saat: 2026-08-25 02:28
 
SQL injection ve Korunma Yöntemleri
2011-02-28 21:58 GMT  oklu Alnt
Kaan

User is: Online status   Gender_M
Posts: 2772
Ülke: İstanbul - 34
Meslek: Serbest Meslek
Age: 43

SQL injection ve Korunma Y?ntemleri

SQL injection yapmak korunmak ?o?u zaman basit bir i?lemdir fakat ?nemli bir konudur. ?imdi basit SQL injection yapmay? sonra farkl? korunma y?ntemlerini inceleyelim.

SQL injection k?t? ama?l?, normalde ?al??mamas? gereken SQL komutlar?d?r. SQL injection ya adres sat?r?ndan ya da input alan?ndan yap?l?r. K?t? ama?l? SQL kodu e?er veriler POST ile yollan?yorsa input alan?na (genellikle text kutusuna), GET metodu ile yollan?yorsa adres sat?r?na girilir.

SQL injection

Basit bir ?rnekle SQL injection yapal?m. ?rne?imizde GET motodu kullanaca??z. Veritaban? olarak Mysql, script dili olarak da php kullanaca??z. ?ncelikle verilerimizin bulundu?u tabloya g?z atal?m. Tablomuzun ad? "people":

?imdi bu verileri GET metodu ile alacak PHP scriptimizi yazal?m:
Kod:
// vetitaban?na ba?lan
$conn = mysql_connect("localhost","root","");
mysql_select_db("test",$conn);

// sorguyu haz?rla
$sql= "SELECT * FROM people WHERE id = '$_GET[id]'";

// sorguyu ?al??t?r
$result= mysql_query($sql,$conn);

// verileri al ve g?ster
while ($row=mysql_fetch_array($result))

{
echo $row['isim']." ";
echo $row['soyisim']."<br />";
}
echo "<br />";
echo "?al??t?r?lan sorgu : ".$sql;

"sql.php" olarak kaydetti?imiz bu PHP scriptini web browserda a??p a?a?? ?ekildeki gibi adres sat?r? sonuna id numaras? 1 olan ki?iyi g?sterecek "?id=1" ekleyelim:

?imdi SQL injection kodumuzu yazal?m ve ??kt?y? alal?m:

SQL injection kodumuzu inceleyelim: 'OR 'x'='x
ilk ' tek t?rnak karakteri id de?erine bo? de?er yollamam?z? sa?l?yor. Fakat sorgunun bo? de?er d?nd?r?p hata vermesini engellemek i?in OR komutu 'x' = 'x ifadesi ile birle?tirilerek her zaman do?ru sonu? d?nd?recek kriter ekleyerek t?m ki?ileri g?rebiliyoruz. ?al??an sorgu ifadesini incelersek ne demek istedi?imi anlayabilirsiniz.

Bunun haricinde farkl? sorgular da yollamak m?mk?n. E?er veritaban? kullan?c?s? yetkileri yeterliyse SELECT sorgusu d???nda DELETE, INSERT , UPDATE ve di?er bir ?ok zararl? SQL kodunu ?al??t?rmak m?mk?n. T?m olay do?ru sql injection yapmaktan ge?iyor.

SQL injection korunma y?ntemleri

SQL injection konusunua k?saca de?indikten sonra ?imdi SQL injection korunma y?ntemlerini inceleyelim. SQL injection yapmaktansa bundan korunmak daha ?nemlidir.

SQL injection'dan kurtulman?n bir ?ok yolu var. Bunlar? listeleyip daha sonra inceleyelim.
Genel SQL injection korunma y?ntemleri:

* GET ya da POST ile yollanan verileri do?rulamak
* G?nderilen verileri filtrelemek
* SQL Parametresi kullanmak (Prepare yapmak)
* Kullan?c? yetkilerini k?s?tlamak
* G?venli?i test etmek, g?zden ge?irmek, ?nemli verileri encrypt etmek

?imdi bunlar? inceleyelim:

SQL injection kurunma y?ntemi 1: GET ya da POST ile yollanan verileri do?rulamak

Do?rulama yapmak basittir. ?rnekle a?a??daki tablodaki karakteri i?eren her hangi bir input alan? varsa kullan?c?y? uyarar tekrer veriyi girmesini sa?lanabilir. Sak?ncal? karakterler:
Kod:
Sak?ncal? karakterler Anlam?
; sorgu ay?rac?
' karakter veri ay?rac?
-- Yorum ayrac?
\* Yorum ayrac? 2

Yukar?daki tablodaki her hangi bir karakter i?eren varsa girdi kabul edilmemelir.
Bununla ilgili basit bir ?rnek yapal?m. A?a??daki PHP kodu girdiyi Regular Expressions ile do?ruluyor. Do?rularsa "do?ruland?" diye ekrana yazd?r?yor. PHP ile girdi do?rulama kodumuz:
Kod:
// Girdiyi  al?yoruz.
//( ?rnek oldu?u i?in girdiyi elle giriyoruz)
$input="Bu girdi kontrol edilecek..'";
// Regular expression ile girdi kontrol (do?rulan?yor) ediliyor.
if (preg_match("/[\-]{2,}|[;]|[']|[\\\*]/", $input))
echo "zararl? karakterler var";
else
echo "do?ruland?";

Yukar?daki kodda input de?erimiz i?inde dikkatle bakarsan?z ' tek t?rnak ay?rac? bulunuyor. By y?zden bu girdi do?rulanmayacakt?r.

SQL injection yapmak i?in kullan?lan ?zel karakterleri daha sorgu ?al??t?r?lmadan girdiyi yukar?daki ?rne?e benzer ?ekilde do?rulay?p soruyu ?al??t?rabiliriz.
Ayn? do?rulama y?ntemini ASP.NET'de de Regular Expressions ile yapabiliriz.

SQL injection kurunma y?ntemi 2: G?nderilen verileri filtrelemek

Seviyeyi biraz daha artt?r?p istedi?imiz karakterler d???ndaki karakterleri filtreleyebiliriz. Bunu yine Regular Expresions kullanarak yapal?m. ?rnek PHP kodumuz:
:
hp]// Girdiyi  al?yoruz.

//(?rnek oldu?u i?in girdiyi elle giriyoruz)

$input="34'; DELETE FROM test";

// Regular expression ile girdiyi filtreliyoruz

// 0 ve 9 aras?nda olmayan t?m karakterleri siler

$input=preg_replace("#[^0-9]#",'', $input);

// a?a??daki sat?r ekrana 34 yazd?r?r

 echo $input;

 

Bu ?rne?imizde filtreleme yaparak direk olarak SQL injection korumas? yapm?? olduk.

SQL injection kurunma y?ntemi 3: SQL Parametresi kullanmak (Prepare yapmak)

Prepere i?lemini hep programlama diliyle hem de Mysql gibi veritanabanlar?nda yapmak m?mk?n.Biz ?rneklerimizde programlama ile yapaca??z. Prepare ile sorgular?m?z? parametre alacak ?ekilde haz?rl?yoruz daha sonra parametreleri ba?layay?p sorguyu ?al??t?r?yoruz. Bu y?ntem bana g?re en ?ok kullan?lmas? gereken y?ntemdir. Prepare i?lemleri ?zellikle birden ?ok paramatre alan sorgular i?in daha uygun. PHP ile Prepare yapal?m. ?rekte PHP 5.1+ ile y?kl? gelen PHP Data Objects (PDO) extension'? kulland?k.
Kod:
// Girdiyi  al?yoruz.
//(?rnek oldu?u i?in girdiyi elle giriyoruz)
$input=1;
// veritaban?na ba?lan?yoruz (PDO : PHP Data Objects (PDO) extension )
// PDO extension PHP 5.1 ile otomatik olarak y?kl? olarak geliyor.
$dbh = new PDO('mysql:host=localhost;dbname=test', 'root', '');
// prepare i?lemi yap?yoruz
$stmt = $dbh ->prepare('SELECT * FROM people WHERE id = :id');
// bind i?lemiyle verimizi ba?l?yoruz
$stmt->bindParam(':id', $input);

// ?al??t?rmay? deneyip hata almazsak ??kt?y? g?steriyoruz
if ($stmt->execute()) {
  while ($row = $stmt->fetch()) {
    echo "<pre>";
    print_r($row);
echo "</pre>";
  }
}

Yukar?daki kodun ??kt?s?n? ?al??t?rd???mda ??yle ald?m:

PHP ortam?nda ?al???yorsan?z Prepare ve Execute yapman?z? sa?layan ?cretsiz da??t?lan farkl? paketler mevcut. Bunlardan birisi PEAR Package'd?r. pear package (prepare i?lemleri yapabilirsiniz kururak) (sql injection ve korunmak) linkinden indirebilirsiniz.

E?er ASP.NET ortam?nda ?al???yorsan?z a?a??daki gibi prepare ve execute i?lemlerini yaparak sql injection korunmas? sa?layabilirsiniz.
Kod:
// id numaras?n? GET metodu ile al?yoruz
string id = Request.QueryString("id");
// SQLcommand nesnesi olu?turuyoruz
SqlCommand cmd = new SqlCommand("SELECT * FROM people WHERE id = @p_id");
// parametre tipini belirliyoruz
var param = new SqlParameter("p_id", SqlDbType.Int);
//parametre de?erini giriyoruz
param.Value = 1;
// parametreyi ba?l?yoruz
cmd.Parameters.Add(param);

Yukar?daki komut g?venle ?al??t?r?labilinir.

Prepare i?lemlerini buna benzer ?ekilde kullanarak SQL injection korunmas? sa?layabilirsiniz. Her ne kadar Prepare i?lemleri PHP ve ASP.NET ortam?nda farkl? olsada ayn? mant??? uygulayabilirsiniz. Bu arada Stored Procedures kullanarak Prepare yaparsan?z en g?zel SQL injection korumas?n? yapm?? olursunuz.

SQL injection kurunma y?ntemi 4: Kullan?c? yetkilerini k?s?tlamak

Bu y?ntem di?er y?ntemlerden biraz farkl?. Sadece kullan?c?n?n SELECT, UPDATE, INSERT, CREATE vb. yetkileri elinden alarak korunma sa?lanm?? olur. En mant?kl?s? e?er INSERT, UPDATE gibi DML (Data Manipulation Language ; veri de?i?tirme dili) kullan?lm?yorsa kullanc?y? sadece SELECT ile k?s?tland?rmak g?zel bir ??z?m olacakt?r.

SQL injection kurunma y?ntemi 5: G?venli?i test etmek, g?zden ge?irmek, ?nemli verileri encrypt etmek

Yap?lan SQL injection korunma y?ntemlerini sa?lad?ktan sonra kendi sisteminize ilk ba?ta kendiniz s?zmal?s?n?z. ??phe duymal?s?n?z. Kulland???n?z y?ntemlere g?venmemelisiniz.
Hi?bir zaman y?zde y?z g?venli bir ortam olmad???n? d???necek olursan?z g?venli?i her zaman elden b?rakmamak gerekir. Zira fark?nda olunmadan bir a??k b?rak?l?rsa neler olaca?? belli olmaz.

?ifreler, Kredi Kard? gibi ?nemli verilerin saf hali de?il md5 gibi algoritmalar kullanarak encrypt edilip veritaban?na girilmelidir.

SQL injection korunma tekniklerinin hepsini k?saca anlatmaya ?al??t?m. Umar?m faydal? bir yaz? olmu?tur.
Konuyla İlgili Diğer Başlıklar
Yorum SQL Injection Yaması
admin.hits.inc.php SQL Injection Açığı (Fixed)
Seditio 170 CSRF and SQL injection
Seditio Sql Injection Hakkında Bilgilendirme
Seditio CMS PmOS Plugin Multiple HTML Injection Vulnerabilities
Emlak, Oto Galeri, Rent A Car, ?iir, Edebiyat Script Sipari?lerinizi Verebilirsiniz.
Detaylar ??in: kaan@ntka.org

Seditio 170 ?ndir
Capte M?zik ?ndir
Seditio Toolbar ?ndir

 

Powered by Seditio © 2009-2012 All Rights Reserved