- function Remove_xss($val) {
- // 印刷できない文字をすべて削除します。 CR(0a)、LF(0b)、TAB(9) が許可されます
- // これにより、 などの一部の文字の再間隔が妨げられます
- // n、r、t による分割を処理する必要があることに注意してください一部の入力では*許可されている*ので後ほど
- //http://blog.qita.in
- $val = preg_replace('/([x00-x08,x0b-x0c,x0e-x19])/', '' , $val);
-
- // 直接の置換。これらは通常の文字であるため、ユーザーはこれらを必要としません
- // これにより、
- $search = 'abcdefghijklmnopqrstuvwxyz';
- $search .= 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
- $search .= '1234567890!@#$%^&*()';
- $search .= '~`";:?+/={}[ ]-_|'\';
- for ($i = 0; $i < strlen($search); $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); // ;
- }
-
- // 残りの空白攻撃は t、n、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; // 前のラウンドで何かが置き換えられている限り置き換え続けます
- 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], 0, 2).''.substr($ra[$i], 2); // <>を追加します。タグをナーフします
- $val = preg_replace($pattern, $replacement, $val); // 16 進タグを除外します
- if ($val_before == $val) {
- // 置換が行われなかったため、ループを終了します
- $found = false;
- }
- }
- }
- return $val;
- }
复制代
|