SQL Injection

Posted by veli on May 02 2008 | PHP, Programlar

Günümüzde uygulama - program gibi kavramlarda büyük değişiklikler olmuştur. İnternet bu kadar yaygın olmadan önce yazılan uygulamaları belirli sayıda kişiler kullanır, uygulamayı kullananlar dışındakiler, uygulama ile ilgili herhangi bir fikir, bilgiye sahip değildi. Ancak internetin yaygınlaşmasıyla birlikte uygulamalar da web tabanlı hale gelir olmuştur. Yani geliştirilen web tabanlı uygulamalar veya web siteleri birden çok kişinin kullanabilmesi amacıyla herkese açık (public) olarak geliştirilmektedir. Hal böyle olunca da var olan sistemlerin bozulması, çökertilmesi için kötü niyetli kişiler yollar aramakta bazen de başarılı olmaktadırlar. Hacker diye tabir edilen kişiler, var olan uygulamaların açıklarını araştırmakta ve koddaki açıklar sayesinde sistemlere girebilmekte veya sistemi çalışmaz hale getirebilmektedirler.

Çok basit ama bir o kadar da yaygın yöntemlerden biri de, kullanıcı adı ve şifre ile girilen alanlara birtakım yöntemler ile girilebilir olmasıdır. Bu yöntemlere genel olarak SQL Injection denir. Aşağıda kısa ama konuyu net olarak özetleyen örneklere yer vereceğiz.

Basit bir üye giriş formu düşünün, bu form nasıl çalışır? Uygulamaya giriş için kullanıcı adı ve şifre girilir, daha sonra arka planda veritabanında bu kullanıcı adı ve şifre eşleşiyor ise yani kullanıcı veritabanında tanımlı ise kontrol başarılı bir şekilde tamamlanmış olmaktadır ve kullanıcı sisteme giriş yapabilir. Herhangi bir site veya web tabanlı uygulamaya herhangi bir saldırı (attack) düzenleneceği zaman ilk olarak bu yol izlenir. SQL injection aşağıdaki şekilde olabilir;

'OR 1 = 1 ...

Evet, sizin de düşündüğünüz gibi yukarıdaki ifade çok basit ancak geriye başarılı sonuç döndürür. Çünkü, SQL ifadesinde OR 1=1 deyimi ile diğer koşulların herhangi bir geçerliliği kalmaz. Niye mi? OR 1 = 1 ile veya 1, 1′e eşitse demiş oluyoruz da o yüzden.Bu tür bir ifade ile tablodaki bilgile okunabilir. Pei bu yöntem tam olarak nasıl gerçekleştirilir. Aşağıdaki gibi adresimiz olduğunu düşünelim;

www.target.com/index.php?id=0

Eğer id değişkeni SQL ifadesi içinde adres satırından olduğu gibi alınıp kullanılırsa bu durum ortaya çıkabilir. Şöyleki;

www.target.com/index.php?id=0 ‘OR 1=1–

Eğer id değeri SQL içinde doğrudan kullanılacak olursa, şöyle bir ifade ortaya çıkar:

admin’–
‘ or 0=0 –
” or 0=0 –
or 0=0 –
‘hi or 1=1–

Peki, bu tür durumların oluşmaması için ne yapılması gerekir. Yapılması gereken en temel işlem, adres satıındanveya session’dan alınan değişkenin içeriğinin uygunluğunun kontrol edilmesidir. Bunun için PHP’nin ctype_alnum, ctype_alpha gibi fonksiyonlar kullanılabilir. Alınabilecek br başka önlem de mysql_real_escape_string fonksiyonunun kullanılmasıdır. Bu fonksiyon ile ifade içindeki tırnak, özel karakter vs. yok edilir.

Son olarak, güvenlik hiçbir zaman kesin değildir, bugün bilinmeyen bazı kod açıkları sonradan ortaya çıkabilir. Dolayısıyla yazılım geliştiriciler tarafından güvenlik ve güvenli kodlama ile ilgili gelişmelerin takip edilmesi gerekecektir.

1 comment for now

One Response to “SQL Injection”

  1. Merhaba Veli,

    Bugüne kadar birçok kişi bana mysql_real_escape_string kullanmam gerektiğini, aksi takdirde SQL injection olacağını söyledi, ancak ben bu olayın ne olduğunu bilmiyordum. Sen anlatmışsın gayet güzel. Teşekkür ederim.

    08 May 2008 at 14:21

Trackback URI | Comments RSS

Yorum Yaz