php Bir çoğumuz uygulama yazmaktayız veya bir şekilde kullanıcılardan veri almaktayız. Herşeyi yapıp bitirdiğimizde ise oh be çekemiyoruz ne yazık ki :) bir de bunun kötü niyetli kişiler olduğunu düşünüp sisteme zarar verecek halleri düşünüp kestirip önüne geçebilmek gerekiyor. Genelde sitelerimize kullanıcının veri girebileceği yerlerden sızmaya çalışılır hoş bazen bir ID alanından da sql injecktion yapılabiliniyor ama ben bu konuda XSS olayına kısaca gireceğim.

XSS açıkları genelde programcının gelen verileri süzmeden veritabanına eklemesi ve listelenmesi olayıyla ya da alınan bir değişken değerin filtrelenmeden ekrana yazdırılmasıyla olmakta. Bu sebeple istenmeyen durumlara sebebiyet vermekte nedir bu sebepler dersek eğer en basitinden yönetici bilgileri çalınabilir eğer cookie bir oturum kullanıyor ise tabiki normal session ise pek bir işe yaramayabilir..

Kısa bir  RemoveXSS fonksiyonunu tanıtacağım zira kendiside çok basit ve etkili bir fonksiyon ve bir çok  xss den kurtulmanıza olanak sağlıyor.

function RemoveXSS($val) {
   $val = preg_replace('/([\x00-\x08,\x0b-\x0c,\x0e-\x19])/', '', $val);
   $search = 'abcdefghijklmnopqrstuvwxyz';
   $search .= 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
   $search .= '1234567890!@#$%^&*()';
   $search .= '~`";:?+/={}[]-_|\'\\';
   for ($i = 0; $i < strlen($search); $i++) {
      $val = preg_replace('/(&#[xX]0{0,8}'.dechex(ord($search[$i])).';?)/i', $search[$i], $val); // with a ;
      $val = preg_replace('/(&#0{0,8}'.ord($search[$i]).';?)/', $search[$i], $val); // with a ;
   }
 
   $ra1 = Array('javascript', 'vbscript', 'expression', 'applet', 'meta', 'xml', 'blink', 'link', 'style', 'script', 'embed', 'object', 'iframe', 'frame', 'frameset', 'ilayer', 'layer', 'bgsound', 'title', 'base');
   $ra2 = Array('onabort', 'onactivate', 'onafterprint', 'onafterupdate', 'onbeforeactivate', 'onbeforecopy', 'onbeforecut', 'onbeforedeactivate', 'onbeforeeditfocus', 'onbeforepaste', 'onbeforeprint', 'onbeforeunload', 'onbeforeupdate', 'onblur', 'onbounce', 'oncellchange', 'onchange', 'onclick', 'oncontextmenu', 'oncontrolselect', 'oncopy', 'oncut', 'ondataavailable', 'ondatasetchanged', 'ondatasetcomplete', 'ondblclick', 'ondeactivate', 'ondrag', 'ondragend', 'ondragenter', 'ondragleave', 'ondragover', 'ondragstart', 'ondrop', 'onerror', 'onerrorupdate', 'onfilterchange', 'onfinish', 'onfocus', 'onfocusin', 'onfocusout', 'onhelp', 'onkeydown', 'onkeypress', 'onkeyup', 'onlayoutcomplete', 'onload', 'onlosecapture', 'onmousedown', 'onmouseenter', 'onmouseleave', 'onmousemove', 'onmouseout', 'onmouseover', 'onmouseup', 'onmousewheel', 'onmove', 'onmoveend', 'onmovestart', 'onpaste', 'onpropertychange', 'onreadystatechange', 'onreset', 'onresize', 'onresizeend', 'onresizestart', 'onrowenter', 'onrowexit', 'onrowsdelete', 'onrowsinserted', 'onscroll', 'onselect', 'onselectionchange', 'onselectstart', 'onstart', 'onstop', 'onsubmit', 'onunload');
   $ra = array_merge($ra1, $ra2);
 
   $found = true;
   while ($found == true) {
      $val_before = $val;
      for ($i = 0; $i < sizeof($ra); $i++) {
         $pattern = '/';
         for ($j = 0; $j < strlen($ra[$i]); $j++) {
            if ($j > 0) {
               $pattern .= '(';
               $pattern .= '(&#[xX]0{0,8}([9ab]);)';
               $pattern .= '|';
               $pattern .= '|(&#0{0,8}([9|10|13]);)';
               $pattern .= ')*';
            }
            $pattern .= $ra[$i][$j];
         }
         $pattern .= '/i';
         $replacement = substr($ra[$i], 0, 2).'<x>'.substr($ra[$i], 2);
         $val = preg_replace($pattern, $replacement, $val);
         if ($val_before == $val) {
            $found = false;
         }
      }
   }
   return $val;
}

Evet üstteki fonksiyonumuz ile kullanıcılardan alınan verileri geçirdiğimizde gönül rahatlığıyla verileri ekleyebilir veya listeleyebiliriz.

Kullanımına bir örnek vererek yazımızı noktalaylım.

$veri = ' Ali Veli Deli <img src="javascript:alert(\'XSS\');"/>';
echo RemoveXSS($veri);

Dediğimizde çıktısı aşağıdaki gibi olacaktır.

 Ali Veli Deli <img src="ja<x>vasc<x>ript:alert('XSS');" />

Görüldüğü üzere javascript kelimesinin arasına ekleyerek olası XSS açığına karşı veriyi güvenli hale getirdi.