SQL injection ve Korunma Yöntemleri
|
#5188 |
|
|
Kaan
User is:
Posts: 2772
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. |
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 |

















