php防御XSS攻撃击、使用方法と详情看
http://www.tongqiong.com/read.php?tid-474.html
- function Remove_xss($val) {
- // すべての印刷不可能な文字を削除します。 CR(0a)、LF(0b)、TAB(9) が許可されます
- // これにより、 などの一部の文字の再間隔が妨げられます
- // n、r、t による分割を処理する必要があることに注意してください一部の入力では*許可されている*ので後ほど
- $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); // ;
- }
- //http://www.tongqiong.com
- // 現在、残っている空白攻撃は t、n、r
- だけです $ra1 = array('javascript', 'vbscript', '式'、'アプレット'、'メタ'、'xml'、'ブリンク'、'リンク'、'スタイル'、'スクリプト'、'埋め込み'、'オブジェクト'、'iframe'、'フレーム'、'フレームセット' , '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;
- }
-
复制代
|