360webscan.php 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. <?php
  2. webscan_error();
  3. //拦截开关(1为开启,0关闭)
  4. $webscan_switch=1;
  5. //提交方式拦截(1开启拦截,0关闭拦截,post,get,cookie,referre选择需要拦截的方式)
  6. $webscan_post=1;
  7. $webscan_get=1;
  8. $webscan_cookie=1;
  9. $webscan_referre=1;
  10. //后台白名单,后台操作将不会拦截,添加"|"隔开白名单目录下面默认是网址带 admin /dede/ 放行
  11. $webscan_white_directory='admin|\/dede\/';
  12. //url白名单,可以自定义添加url白名单,默认是对phpcms的后台url放行
  13. //写法:比如phpcms 后台操作url index.php?m=admin php168的文章提交链接post.php?job=postnew&step=post ,dedecms 空间设置edit_space_info.php
  14. $webscan_white_url = array('index.php' => 'm=admin','post.php' => 'job=postnew&step=post','edit_space_info.php'=>'');
  15. //防护脚本版本号
  16. define("WEBSCAN_VERSION", '0.1.3.2');
  17. //get拦截规则
  18. $getfilter = "\\<.+javascript:window\\[.{1}\\\\x|<.*=(&#\\d+?;?)+?>|<.*(data|src)=data:text\\/html.*>|\\b(alert\\(|confirm\\(|expression\\(|prompt\\(|benchmark\s*?\(.*\)|sleep\s*?\(.*\)|load_file\s*?\\()|<[a-z]+?\\b[^>]*?\\bon([a-z]{4,})\s*?=|^\\+\\/v(8|9)|\\b(and|or)\\b\\s*?([\\(\\)'\"\\d]+?=[\\(\\)'\"\\d]+?|[\\(\\)'\"a-zA-Z]+?=[\\(\\)'\"a-zA-Z]+?|>|<|\s+?[\\w]+?\\s+?\\bin\\b\\s*?\(|\\blike\\b\\s+?[\"'])|\\/\\*.*\\*\\/|<\\s*script\\b|\\bEXEC\\b|UNION.+?SELECT\s*(\(.+\)\s*|@{1,2}.+?\s*|\s+?.+?|(`|'|\").*?(`|'|\")\s*)|UPDATE\s*(\(.+\)\s*|@{1,2}.+?\s*|\s+?.+?|(`|'|\").*?(`|'|\")\s*)SET|INSERT\\s+INTO.+?VALUES|(SELECT|DELETE)@{0,2}(\\(.+\\)|\\s+?.+?\\s+?|(`|'|\").*?(`|'|\"))FROM(\\(.+\\)|\\s+?.+?|(`|'|\").*?(`|'|\"))|(CREATE|ALTER|DROP|TRUNCATE)\\s+(TABLE|DATABASE)";
  19. //post拦截规则
  20. $postfilter = "<.*=(&#\\d+?;?)+?>|<.*data=data:text\\/html.*>|\\b(alert\\(|confirm\\(|expression\\(|prompt\\(|benchmark\s*?\(.*\)|sleep\s*?\(.*\)|load_file\s*?\\()|<[^>]*?\\b(onerror|onmousemove|onload|onclick|onmouseover)\\b|\\b(and|or)\\b\\s*?([\\(\\)'\"\\d]+?=[\\(\\)'\"\\d]+?|[\\(\\)'\"a-zA-Z]+?=[\\(\\)'\"a-zA-Z]+?|>|<|\s+?[\\w]+?\\s+?\\bin\\b\\s*?\(|\\blike\\b\\s+?[\"'])|\\/\\*.*\\*\\/|<\\s*script\\b|\\bEXEC\\b|UNION.+?SELECT\s*(\(.+\)\s*|@{1,2}.+?\s*|\s+?.+?|(`|'|\").*?(`|'|\")\s*)|UPDATE\s*(\(.+\)\s*|@{1,2}.+?\s*|\s+?.+?|(`|'|\").*?(`|'|\")\s*)SET|INSERT\\s+INTO.+?VALUES|(SELECT|DELETE)(\\(.+\\)|\\s+?.+?\\s+?|(`|'|\").*?(`|'|\"))FROM(\\(.+\\)|\\s+?.+?|(`|'|\").*?(`|'|\"))|(CREATE|ALTER|DROP|TRUNCATE)\\s+(TABLE|DATABASE)";
  21. //cookie拦截规则
  22. $cookiefilter = "benchmark\s*?\(.*\)|sleep\s*?\(.*\)|load_file\s*?\\(|\\b(and|or)\\b\\s*?([\\(\\)'\"\\d]+?=[\\(\\)'\"\\d]+?|[\\(\\)'\"a-zA-Z]+?=[\\(\\)'\"a-zA-Z]+?|>|<|\s+?[\\w]+?\\s+?\\bin\\b\\s*?\(|\\blike\\b\\s+?[\"'])|\\/\\*.*\\*\\/|<\\s*script\\b|\\bEXEC\\b|UNION.+?SELECT\s*(\(.+\)\s*|@{1,2}.+?\s*|\s+?.+?|(`|'|\").*?(`|'|\")\s*)|UPDATE\s*(\(.+\)\s*|@{1,2}.+?\s*|\s+?.+?|(`|'|\").*?(`|'|\")\s*)SET|INSERT\\s+INTO.+?VALUES|(SELECT|DELETE)@{0,2}(\\(.+\\)|\\s+?.+?\\s+?|(`|'|\").*?(`|'|\"))FROM(\\(.+\\)|\\s+?.+?|(`|'|\").*?(`|'|\"))|(CREATE|ALTER|DROP|TRUNCATE)\\s+(TABLE|DATABASE)";
  23. //referer获取
  24. $webscan_referer = empty($_SERVER['HTTP_REFERER']) ? array() : array('HTTP_REFERER'=>$_SERVER['HTTP_REFERER']);
  25. /**
  26. * 关闭用户错误提示
  27. */
  28. function webscan_error() {
  29. if (ini_get('display_errors')) {
  30. ini_set('display_errors', '0');
  31. }
  32. }
  33. /**
  34. * 参数拆分
  35. */
  36. function webscan_arr_foreach($arr) {
  37. static $str;
  38. static $keystr;
  39. if (!is_array($arr)) {
  40. return $arr;
  41. }
  42. foreach ($arr as $key => $val ) {
  43. $keystr=$keystr.$key;
  44. if (is_array($val)) {
  45. webscan_arr_foreach($val);
  46. } else {
  47. $str[] = $val.$keystr;
  48. }
  49. }
  50. return implode($str);
  51. }
  52. /**
  53. * 防护提示页
  54. */
  55. function webscan_pape(){
  56. $pape=<<<HTML
  57. <html>
  58. <body style="margin:0; padding:0">
  59. <h1>Bad Request</h1>
  60. </body>
  61. </html>
  62. HTML;
  63. echo $pape;
  64. }
  65. /**
  66. * 攻击检查拦截
  67. */
  68. function webscan_StopAttack($StrFiltKey,$StrFiltValue,$ArrFiltReq,$method) {
  69. $StrFiltValue=webscan_arr_foreach($StrFiltValue);
  70. if (preg_match("/".$ArrFiltReq."/is",$StrFiltValue)==1){
  71. exit(webscan_pape());
  72. }
  73. if (preg_match("/".$ArrFiltReq."/is",$StrFiltKey)==1){
  74. exit(webscan_pape());
  75. }
  76. }
  77. /**
  78. * 拦截目录白名单
  79. */
  80. function webscan_white($webscan_white_name,$webscan_white_url=array()) {
  81. $url_path=$_SERVER['SCRIPT_NAME'];
  82. $url_var=$_SERVER['QUERY_STRING'];
  83. if (preg_match("/".$webscan_white_name."/is",$url_path)==1&&!empty($webscan_white_name)) {
  84. return false;
  85. }
  86. foreach ($webscan_white_url as $key => $value) {
  87. if(!empty($url_var)&&!empty($value)){
  88. if (stristr($url_path,$key)&&stristr($url_var,$value)) {
  89. return false;
  90. }
  91. }
  92. elseif (empty($url_var)&&empty($value)) {
  93. if (stristr($url_path,$key)) {
  94. return false;
  95. }
  96. }
  97. }
  98. return true;
  99. }
  100. if ($webscan_switch&&webscan_white($webscan_white_directory,$webscan_white_url)) {
  101. if ($webscan_get) {
  102. foreach($_GET as $key=>$value) {
  103. webscan_StopAttack($key,$value,$getfilter,"GET");
  104. }
  105. }
  106. if ($webscan_post) {
  107. foreach($_POST as $key=>$value) {
  108. webscan_StopAttack($key,$value,$postfilter,"POST");
  109. }
  110. }
  111. if ($webscan_cookie) {
  112. foreach($_COOKIE as $key=>$value) {
  113. webscan_StopAttack($key,$value,$cookiefilter,"COOKIE");
  114. }
  115. }
  116. if ($webscan_referre) {
  117. foreach($webscan_referer as $key=>$value) {
  118. webscan_StopAttack($key,$value,$postfilter,"REFERRER");
  119. }
  120. }
  121. }