/**
* 安全过滤函数
*
* @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 = str_replace("{",'',$string);
$string = str_replace('}','',$string);
$string = str_replace('','',$string);
return $string;
}
?>
/**
* 返回经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;
}
?>
//对请求的字符串进行安全处理
/*
$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("#]*>#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);
$str = preg_replace("#[ ]{1,}#", ' ', $str);
return $str;
}else{
return $str;
}
}
?>
/**
+------------------------------------------------ ----------
* 危険なコードをフィルタリングするために使用される安全な HTML を出力します
+------------------------------------------------ ----------
* @アクセス公開
+------------------------------------------------ ----------
* @param string $text 処理対象の文字列
* @param は許可されるタグの $tags リストを混合します (table|td|th|td など)
+------------------------------------------------ ----------
* @戻り文字列
+------------------------------------------------ ----------
*/
静的パブリック関数safeHtml($text, $tags = null)
{
$text = トリム($text);
// コメントを完全にフィルターします
$text = preg_replace('//','',$text);
//動的コードを完全にフィルタリングします
$ Text = Preg_replace ('/& LT;? |?'. '& GT;/', '', $ Text);
//jsを完全にフィルタリングします
$text = preg_replace('/<script>/','',$text);<br />
$text = str_replace('[','[',$text);<br />
$text = str_replace(']',']',$text);<br />
$text = str_replace('|','|',$text);<br />
//改行をフィルタリングします<br />
$text = preg_replace('/ ? /','',$text);<br />
//br<br />
$ Text = preg_replace ('/& lt; br (s/s/s/s/s/s/s/i', '[br]', $ text); <br />
$text = preg_replace('/([br]s*){10,}/i','[br]',$text);<br />
//イベント lang js でフィルターするなど、危険な属性をフィルターします<br />
while(preg_match('/(<[^><]+)(lang|on|action|background|codebase|dynsrc|lowsrc)[^><]+/i',$text,$mat )){<br />
$text=str_replace($mat[0],$mat[1],$text);<br />
}<br />
while(preg_match('/(<[^><]+)(window.|javascript:|js:|about:|file:|document.|vbs:|cookie)([^><] *)/i',$text,$mat)){<br />
$text=str_replace($mat[0],$mat[1].$mat[3],$text);<br />
}<br />
if( empty($allowTags) ) { $allowTags = self::$htmlTags['allow'] }<br />
//許可される HTML タグ<br />
$text = preg_replace('/<('.$allowTags.')( [^><[]]*)>/i','[12]',$text);<br />
// 余分な HTML をフィルタ<br />
If ( empty($banTag) ) { $banTag = self::$htmlTags['ban'] }<br />
$ Text = preg_replace ('/& lt;/? ('. $ Bantag. ') [^& Gt; & lt;]*& gt;/i', '', $ text);
// 有効な HTML タグをフィルタリングします<br />
while(preg_match('/<([a-z]+)[^><[]]*>[^><]*</1>/i',$text,$mat)) {<br />
$text=str_replace($mat[0],str_replace('>',']',str_replace('<','[',$mat[0])),$text);<br />
}<br />
//转换引号<br />
while(preg_match('/([[^[]]*=s*)("|')([^2=[]]+)2([^[]]*])/i',$text,$mat)){<br />
$text=str_replace($mat[0],$mat[1].'|'.$mat[3].'|'.$mat[4],$text);<br />
}<br />
//空属性转换<br />
$text = str_replace('''','||',$text);<br />
$text = str_replace('""','||',$text);<br />
//过滤错误的单个引号<br />
while(preg_match('/[[^[]]*("|')[^[]]*]/i',$text,$mat)){<br />
$text=str_replace($mat[0],str_replace($mat[1],'',$mat[0]),$text);<br />
}<br />
//转换其它所有不合法的 < ><br />
$text = str_replace('<','<',$text);<br />
$text = str_replace('>','>',$text);<br />
$text = str_replace('"','"',$text);<br />
//反转换<br />
$text = str_replace('[','<',$text);<br />
$text = str_replace(']','>',$text);<br />
$text = str_replace('|','"',$text);<br />
//过滤多余空格<br />
$text = str_replace(' ',' ',$text);<br />
return $text;<br />
}<br />
?></script>
関数 RemoveXSS($val) {
// 印刷できない文字をすべて削除します。 CR(0a)、LF(0b)、TAB(9) が許可されます
// これにより、 などの一部の文字の再間隔が妨げられます。
// 一部の入力では * 許可されている * ため、 、 、およびそれ以降で分割を処理する必要があることに注意してください。 // 入力
$val = preg_replace('/([x00-x08,x0b-x0c,x0e-x19])/', '', $val);
// 直接の置換。これらは通常の文字であるため、ユーザーはこれらを必要としないはずです
// これにより、 のようなことが防止されます。
$search = 'abcdefghijklmnopqrstuvwxyz';
$search .= 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
$search .= '1234567890!@#$%^&*()';
$search .= '~`";:?+/={}[]-_|'';
for ($i = 0; $i
// ;? ; と一致しますが、これはオプションです
// 0{0,7} は任意の埋め込みゼロと一致します。これはオプションで最大 8 文字までです
// @ @ 16 進数の値を検索します
$val = preg_replace('/([xX]0{0,8}'.dechex(ord($search[$i])).';?)/i', $search[$i], $ val);//; 付き
// @ @ 0{0,7} は '0' と 0 ~ 7 回一致します
$val = preg_replace('/({0,8}'.ord($search[$i]).';?)/', $search[$i], $val); // とともに ;
}
// 現在、残っている空白攻撃は 、 、 だけです
$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
$パターン = '/';
for ($j = 0; $j
if ($j > 0) {
$pattern .= '(';
$pattern .= '([xX]0{0,8}([9ab]);)'; $パターン .= '|';
$pattern .= '|({0,8}([9|10|13]);)';
$パターン .= ')*';
}
$pattern .= $ra[$i][$j];
}
$pattern .= '/i';
$replacement = substr($ra[$i], 0, 2).''.substr($ra[$i], 2); // を追加します。タグをナーフします
$val = preg_replace($pattern, $replacement, $val); // 16 進タグをフィルターで除外します
if ($val_before == $val) {
// 置換は行われなかったので、ループを終了します
$found = false;
}
}
}
$val を返します。
}
?>
|