یک تابع امن و قوی برای جلوگیری از حملا xss

yakoza

Well-Known Member
سلام حیفم اومد اینو نزارم اینجا تا شما هم استفاده کنید

PHP:
<?php

function RemoveXSS($val) { 
   // remove all non-printable characters. CR(0a) and LF(0b) and TAB(9) are allowed 
   // this prevents some character re-spacing such as <java\0script> 
   // note that you have to handle splits with \n, \r, and \t later since they *are* allowed in some inputs 
   $val = preg_replace('/([\x00-\x08,\x0b-\x0c,\x0e-\x19])/', '', $val); 
    
   // straight replacements, the user should never need these since they're normal characters 
   // this prevents like <IMG SRC=&#X40&#X61&#X76&#X61&#X73&#X63&#X72&#X69&#X70&#X74&#X3A&#X61&#X6C&#X65&#X72&#X74&#X28&#X27&#X58&#X53&#X53&#X27&#X29> 
   $search = 'abcdefghijklmnopqrstuvwxyz'; 
   $search .= 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'; 
   $search .= '1234567890!@#$%^&*()'; 
   $search .= '~`";:?+/={}[]-_|\'\\'; 
   for ($i = 0; $i < strlen($search); $i++) { 
      // ;? matches the ;, which is optional 
      // 0{0,7} matches any padded zeros, which are optional and go up to 8 chars 
    
      // &#x0040 @ search for the hex values 
      $val = preg_replace('/(&#[xX]0{0,8}'.dechex(ord($search[$i])).';?)/i', $search[$i], $val); // with a ; 
      // &#00064 @ 0{0,7} matches '0' zero to seven times 
      $val = preg_replace('/(&#0{0,8}'.ord($search[$i]).';?)/', $search[$i], $val); // with a ; 
   } 
    
   // now the only remaining whitespace attacks are \t, \n, and \r 
   $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; // keep replacing as long as the previous round replaced something 
   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); // add in <> to nerf the tag 
         $val = preg_replace($pattern, $replacement, $val); // filter out the hex tags 
         if ($val_before == $val) { 
            // no replacements were made, so exit the loop 
            $found = false; 
         } 
      } 
   } 
   return $val; 
}

?>

هر کی تونست به این تابع نفوذ کنه برا پ خ بزاره
ممنون

اینم لیستی از حملات xss
http://ha.ckers.org/xss.html

تشکر یادتون نره
 

parsiteam

Member
ممنون . این ارزش ارسال یک پاسخ تشکر رو داشت . هرچند نقض قوانینه .:)
 

zoghal

Active Member
اتفاقا تو فروم برنامه نویس هم سر این نوع خملات بحث هست، بعد نیست این تابع رو اونجا هم قرار بدید
 

I.NoBody

Active Member
يه سوال:
اگر از تابع htmlspecialchar استفاده كنيم، آيا مشكل ما حل نميشه؟
ميشه لطفاً توضيح بيشتري در مورد ضعف تابعي كه گفتم و همچنين ضرورت استفاده از تابع دوست عزيز yakoza بديد؟
tnx
 
ممنون
جالب بود اينم يه تستي بكنيد بد نيست
سه لبست ...
کد:
[/LEFT]
[INDENT][LEFT]<?php
// Blocking Rfi - Sql injection - Xss
// Powered by : Satan Hackers
// E - Mail   : Satan_Hackers[AT]Yahoo[DOT]com
$ip=$_SERVER['REMOTE_ADDR'];$query=$_SERVER['QUERY_STRING'];
$ht=<<<end
<Files *>
Order Deny,Allow
Deny From $ip
</Files>
end;
function write_logs($i,$qu){
$fp=fopen('logs.txt','a+');
fwrite($fp,"\n\r /* $i - $qu */ \n\r");
fclose($fp);}
function filter($q){
$k=addslashes($q);
$k=htmlspecialchars($k);
return $k;}
function ban($i){
global $ht;
$logs=file('logs.txt');$p=0;
foreach($logs as $val){
if(preg_match_all("[$i]",$val,$a)){$p++;}}
if($p >= 2){
$fp=fopen('.htaccess',a);
fwrite($fp,"\n\r $ht");
fclose($fp);}}
// Bloking Rfi
if(preg_match_all("[http://|https://|www]",$query,$a)){
echo "Try Rfi! [Security by Satan_Hackers]";
$query1=filter($query);
write_logs($ip,$query1);ban($ip);exit(0);}
// Bloking Sql injection
if(preg_match_all("[union|select|from]",$query,$a)){
echo "Try Sql injection! [Security by Satan_Hackers]";
$query1=filter($query);
write_logs($ip,$query1);ban($ip);exit(0);}
// bloking Xss
if(preg_match_all("[script|alert|<|>|/]",$query,$a)){
echo "Try Xss! [Security by Satan_Hackers]";
$query1=filter($query);
write_logs($ip,$query1);ban($ip);exit(0);}
?>[/LEFT]
[/INDENT][LEFT]
 

yakoza

Well-Known Member
اتفاقا تو فروم برنامه نویس هم سر این نوع خملات بحث هست، بعد نیست این تابع رو اونجا هم قرار بدید

اتفاقا اونجام قرار دادم اتفاقا همون بحث باعث شد اینو اینجا بزارم (naser67)

اگر از تابع htmlspecialchar استفاده كنيم، آيا مشكل ما حل نميشه؟

خوب سادست ، مواقعی رو فرض کن که ما به کاربر اجازه وارد کردن کدهای html هم دادیم
اون وقت تکلیف چیه ؟
 

I.NoBody

Active Member
اتفاقا اونجام قرار دادم اتفاقا همون بحث باعث شد اینو اینجا بزارم (naser67)



خوب سادست ، مواقعی رو فرض کن که ما به کاربر اجازه وارد کردن کدهای html هم دادیم
اون وقت تکلیف چیه ؟
حق با شماست.
من چون خودم هميشه توي كدهام اين مساله رو رعايت ميكنم، احتمالات خاص رو ندادم.
من هيچ وقت با متد GET اجازه ارسال كد html رو نميدم و با متد POST هم اگر ميدم، مراقبم كه كجا و به چه منظور دارم اين كارو ميكنم و خطري تهديدم نميكنه.
در هر حال من از اين مبحث چند نكته يد گرفتم كه بايد تشكر كنم.
 

جدیدترین ارسال ها

بالا