Cumartesi, 19 Haziran 2010

SQL Injection Önlemleri

 

CodeIgniter kullanılarak yazdığımız kodlarda, kullanıcıdan alınan bilgilerdeki zararlı kodların temizlenmesi için bir kaç aşamada filtre koyabiliriz.

Form_validation kütüphanesi ile her kullanıcı girdisi xss_clean opsiyonu kullanılarak temizlenir. Ancak şuna dikkat etmek gerekir ki, xss_clean opsiyonu ile sadece zararlı kodlar temizlenirken tırnak işareti eklenerek yapılan SQL Injection saldırıları temizlenmez.

Eğer kullanıcıdan aldığımız girdileri model dosyamızdaki fonksiyonlar ile veritabanından bilgi çekmekte kullanacaksak, Active Record sınıfını kullanmamız bu tür SQL Injection saldırılarını önlemek için yeterlidir. Bu durumda Active Record sınıfına ait fonksiyonlar bu tür sızlamaları engelleyeceklerdir. Aşağıdaki model fonksiyonu satırında $array ile aktarılan değişkende saldırı cümlesi olsa dahi temizlenecektir:

...
 $this->db->get_where('users',$array);
...

Ancak bazı karmaşık sorgu gerektiren durumlarda active record sınıfı fonksiyonları kullanmak yerine, $this->db->query() fonksiyonunu kullanarak kendi sorgu cümlemizi kendimiz yazma yoluna gideriz. Böyle durumlarda dikkat edilmesi gerekli en önemli konu, kullanıcıdan alınan bilgilerdeki SQL Injection saldırılarının temizlenMEdiğidir. Aşağıdaki model fonksiyonu cümlesine zararlı kodlar gönderilmesi durumunda -en iyi ihtimalle- ekrana hata mesajı dönecektir.

...
 $this->db->query("
  SELECT
  FROM users
  WHERE username = '$input'
 ")
...

Active Record sınıfının kullanılamadığı durumlarda yapılması mutlaka gereken önkem, kullanıcı girişinin yapıldığı değişkenlerin mysql_real_escape_string filtresinden geçilrilmesidir. Buna göre controller sınıfı içinde okunan her kullanıcı girdisi için bu filtrenin kullanılmasında fayda vardır.

...
 $username = mysql_real_escape_string($this->input->post('usersname'));
...

Yorumlar

Makale için teşekkürler elinize sağlık. mysql_real_escape_string yerine

$this->db->escape();
$this->db->escape_str();

vb. CodeIgniter kütüphanesinin fonksiyonları da kullanılabilir.

$this->input->post - get('q'); gibi alındıgında temizleme yapıyor sanırım. Kod incelemedim ama öyle hatırlıyorum. 

$this->db->get('field',TRUE);

şeklinde xss açıklarından korunabilirsiniz.

@Omer: Yazımda da dediğim gibi post ve get için istenilen etkiyi göstermez. Burada bahsedilen MySQL cümlelerine sızmada kullanılan zararlı kodlardır. Ibrahim'İn dediği yöntem kullanılarak da aynı sorun çözülebilir. Ancak o yöntemde her sorugu içinde bahsedilen kodu kullanmanız gereklidir.

Deneme yaparsanız hatayı kendiniz de görebilirsiniz.

$sql = 'select * from tabloadi where sutun1=? and sutun2=?';

$this->db->query($sql, array($degisken1,$degisken2));
bu yöntemle temizleme işlemi otomotik yapılıyordu galiba ?

@Serkan: Haklısın. Bind query opsiyonu da otomatik olarak ayıklıyor.

Arkadaşlar bu konu ile ilgili olarak alınacak bir önlemi de Google Groups sayfasında bahsettim. Yakın gelecekte bu konu ile ilgili daha geniş bir yazı hazırlamayı planlıyorum.

Yorum Ekle