XSS攻撃に対するphpの防御

WBOY
WBOYオリジナル
2016-07-25 09:01:051273ブラウズ
php防御XSS攻撃击、使用方法と详情看 http://www.tongqiong.com/read.php?tid-474.html
  1. function Remove_xss($val) {
  2. // すべての印刷不可能な文字を削除します。 CR(0a)、LF(0b)、TAB(9) が許可されます
  3. // これにより、 などの一部の文字の再間隔が妨げられます
  4. // n、r、t による分割を処理する必要があることに注意してください一部の入力では*許可されている*ので後ほど
  5. $val = preg_replace('/([x00-x08,x0b-x0c,x0e-x19])/', '', $val);
  6. // 直接置換、これらは通常の文字であるため、ユーザーはこれらを必要とすることはありません
  7. // これにより、
  8. $search = 'abcdefghijklmnopqrstuvwxyz';
  9. $search .= 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' のようなことが防止されます;
  10. $search .= '1234567890!@#$%^&*()';
  11. $search .= '~`";:?+/={}[]-_|'\';
  12. for ($ i = 0; $i < strlen($search); $i++) {
  13. // ;? はオプションです
  14. // 0{0,7} は任意の埋め込みゼロと一致します8文字まで
  15. // @ @ 16進値を検索します
  16. $val = preg_replace('/(&#[xX]0{0,8}'.dechex(ord($search[$i])).' ;?)/i', $search[$i], $val); // ;
  17. を使用 // @ @ 0{0,7} は '0' に 0 回から 7 回一致します
  18. $val = preg_replace('/ (?{0,8}'.ord($search[$i]).';?)/', $search[$i], $val); // ;
  19. }
  20. //http://www.tongqiong.com
  21. // 現在、残っている空白攻撃は t、n、r
  22. だけです $ra1 = array('javascript', 'vbscript', '式'、'アプレット'、'メタ'、'xml'、'ブリンク'、'リンク'、'スタイル'、'スクリプト'、'埋め込み'、'オブジェクト'、'iframe'、'フレーム'、'フレームセット' , 'ilayer', 'layer', 'bgsound', 'title', 'base');
  23. $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');
  24. $ra = array_merge($ra1, $ra2);
  25. $found = true; // 前のラウンドで何かが置き換えられている限り置き換え続けます
  26. while ($found == true) {
  27. $val_before = $val;
  28. for ($i = 0; $i < sizeof($ra); $i++) {
  29. $pattern = '/';
  30. for ($j = 0; $j < strlen($ra[$i]); $j++) {
  31. if ($j > 0) {
  32. $pattern .= '(';
  33. $pattern .= '(&#[xX]0{0,8}([9ab]);)';
  34. $pattern .= '|';
  35. $pattern .= '|(?{ 0,8}([9|10|13]);)';
  36. $pattern .= ')*';
  37. }
  38. $pattern .= $ra[$i][$j];
  39. }
  40. $pattern .= '/i';
  41. $replacement = substr($ra[$i], 0, 2).''.substr($ra[$i], 2); // <>を追加します。タグをナーフします
  42. $val = preg_replace($pattern, $replacement, $val); // 16 進タグを除外します
  43. if ($val_before == $val) {
  44. // 置換が行われなかったため、ループを終了します
  45. $found = false;
  46. }
  47. }
  48. }
  49. return $val;
  50. }
复制代


声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。