微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

PHP利用str_replace防注入的方法

PHP各种过滤字符函数

代码如下:
PHP
/**
* 安全过滤函数
*
* @param $string
* @return string
*/
function safe_replace($string) {
$string = str_replace('%20','',$string);
$string = str_replace('%27',$string);
$string = str_replace('%2527',$string);
$string = str_replace('*',$string);
$string = str_replace('"','"',$string);
$string = str_replace("'",$string);
$string = str_replace(';',$string);
$string = str_replace('<','<',$string);
$string = str_replace('>','>',$string);
$string = str_replace("{",$string);
$string = str_replace('}',$string);
$string = str_replace('',$string);
return $string;
}
?>


PHP
/**
* 返回经addslashes处理过的字符串或数组
* @param $string 需要处理的字符串或数组
* @return mixed
*/
function new_addslashes($string) {
if(!is_array($string)) return addslashes($string);
foreach($string as $key => $val) $string[$key] = new_addslashes($val);
return $string;
}
?>


PHP
//对请求的字符串进行安全处理
/*
$safestep
0 为不处理,
1 为禁止不安全HTML内容(javascript等),
2 完全禁止HTML内容,并替换部份不安全字符串(如:eval(、union、CONCAT(、--、等)
*/
function StringSafe($str,$safestep=-1){
$safestep = ($safestep > -1) ? $safestep : 1;
if($safestep == 1){
$str = preg_replace("#script:#i","script:",$str);
$str = preg_replace("#<[/]{0,1}(link|meta|ifr|fra|scr)[^>]*>#isU",$str);
$str = preg_replace("#[ ]{1,}#",' ',$str);
return $str;
}else if($safestep == 2){
$str = addslashes(htmlspecialchars(stripslashes($str)));
$str = preg_replace("#eval#i",'eval',$str);
$str = preg_replace("#union#i",'union',$str);
$str = preg_replace("#concat#i",'concat',$str);
$str = preg_replace("#--#",'--',$str);
return $str;
}else{
return $str;
}
}
?>


PHP
/**
+----------------------------------------------------------
* 输出安全的html,用于过滤危险代码
+----------------------------------------------------------
* @access public
+----------------------------------------------------------
* @param string $text 要处理的字符串
* @param mixed $tags 允许的标签列表,如 table|td|th|td
+----------------------------------------------------------
* @return string
+----------------------------------------------------------
*/
static public function safeHtml($text,$tags = null)
{
$text = trim($text);
//完全过滤注释
$text = preg_replace('//',$text);
//完全过滤动态代码
$text = preg_replace('//',$text);
//完全过滤js
$text = preg_replace('//',$text);
$text = str_replace('[','[',$text);
$text = str_replace(']',']',$text);
$text = str_replace('|','|',$text);
//过滤换行符
$text = preg_replace('/ ? /',$text);
//br
$text = preg_replace('//i','[br]',$text);
$text = preg_replace('/([br]s*){10,}/i',$text);
//过滤危险的属性,如:过滤on事件lang js
while(preg_match('/(<[^><]+)(lang|on|action|background|codebase|dynsrc|lowsrc)[^><]+/i',$text,$mat)){
$text=str_replace($mat[0],$mat[1],$text);
}
while(preg_match('/(<[^><]+)(window.|javascript:|js:|about:|file:|document.|vbs:|cookie)([^><]*)/i',$mat[1].$mat[3],$text);
}
if( empty($allowTags) ) { $allowTags = self::$htmlTags['allow']; }
//允许的HTML标签
$text = preg_replace('/<('.$allowTags.')( [^><[]]*)>/i','[12]',$text);
//过滤多余html
if ( empty($banTag) ) { $banTag = self::$htmlTags['ban']; }
$text = preg_replace('/<]*>/i',$text);
//过滤合法的html标签
while(preg_match('/<([a-z]+)[^><[]]*>[^><]*/i',str_replace('>',']',str_replace('<','[',$mat[0])),$text);
}
//转换引号
while(preg_match('/([[^[]]*=s*)("|')([^2=[]]+)2([^[]]*])/i',$mat[1].'|'.$mat[3].'|'.$mat[4],$text);
}
//空属性转换
$text = str_replace('''','||',$text);
$text = str_replace('""',$text);
//过滤错误的单个引号
while(preg_match('/[[^[]]*("|')[^[]]*]/i',str_replace($mat[1],$mat[0]),$text);
}
//转换其它所有不合法的 < >
$text = str_replace('<',$text);
$text = str_replace('>',$text);
$text = str_replace('"',$text);
//反转换
$text = str_replace('[','"',$text);
//过滤多余空格
$text = str_replace(' ',$text);
return $text;
}
?>


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
// note that you have to handle splits with,and 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
$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
// @ @ search for the hex values
$val = preg_replace('/(&#[xX]0{0,8}'.dechex(ord($search[$i])).';?)/i',$search[$i],$val);//with a ;
// @ @ 0{0,7} matches '0' zero to seven times
$val = preg_replace('/(�{0,8}'.ord($search[$i]).';?)/',$val); // with a ;
}
// Now the only remaining whitespace attacks are,and
$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,8}([9|10|13]);)';
$pattern .= ')*';
}
$pattern .= $ra[$i][$j];
}
$pattern .= '/i';
$replacement = substr($ra[$i],2).''.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;
}
?>

原文地址:https://www.jb51.cc/php/25473.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐