12.10 应用自身的安全中心

虽然现在基于主机WAF、云WAF随随便便都能列出一大堆,但是毕竟这些防御方案都不是定制化的,因为无法结合应用代码逻辑,所以无法很好地防御攻击和满足需求,而应用代码层的防御则可以大大利用白名单的优势,比如已经知道某个参数一定是INT类型,就可以在使用这个参数时将其转为INT类型,或者判断是否为数字,如果不是则将请求驳回,这些优势是其他层面的WAF无法取代的,因此应用自身的安全防御功能必不可少。

目前开源应用几乎都有自身的防御措施,比如phpcmsv9,其代码如下:


class param {

      //
路由配置

      private $route_config = ''


      public function __construct
() {

          if
(! get_magic_quotes_gpc ()) {

             $_POST = new_addslashes
$_POST );

             $_GET = new_addslashes
$_GET );

             $_REQUEST = new_addslashes
$_REQUEST );

             $_COOKIE = new_addslashes
$_COOKIE );

      }

在参数传入时会对$_GET/$_POST/$_COOKIE和$_REQUEST变量进行转义,然后在数据库操作时又会进行过滤,代码如下:


/**

*
安全过滤函数

*

* @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
'"' '&quot ' $string );

    $string = str_replace
"'" '' $string );

    $string = str_replace
'"' '' $string );

    $string = str_replace
' ' '' $string );

    $string = str_replace
'<' '&lt ' $string );

    $string = str_replace
'>' '&gt ' $string );

    $string = str_replace
"{" '' $string );

    $string = str_replace
'}' '' $string );

    $string = str_replace
'\\' '' $string );

    return $string


}

/**

* xss
过滤函数

*

* @param $string

* @return string

*/

function remove_xss
$string {

    $string = preg_replace
'/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F]+/S' '' $string );

    $parm1 = Array
'javascript' 'vbscript' 'expression' 'applet' 'meta' 'xml' 'blink' 'link' 'script' 'embed' 'object' 'iframe' 'frame' 'frameset' 'ilayer' 'layer' 'bgsound' 'title' 'base' );

    $parm2 = 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' );

      $parm = array_merge
$parm1 $parm2 );

      for
$i = 0 $i < sizeof $parm ); $i++ {

          $pattern = '/'


          for
$j = 0 $j < strlen $parm[$i] ); $j++ {

              if
$j > 0 {

                  $pattern .= '
'

                  $pattern .= '
&#[x|X]0 [9][a][b] );?)? '

                  $pattern .= '|
&#0 [9][10][13] );?)? '

                  $pattern .= '
)? '

              }

                  $pattern .= $parm[$i][$j]


          }

          $pattern .= '/i'


          $string = preg_replace
$pattern ' ' $string );

      }

      return $string


}

/**

*
对字段两边加反引号,以保证数据库安全

* @param $value
数组值

*/

public function add_special_char
&$value {

    if
'*' == $value || false == strpos $value ' ' || false == strpos $value '.' || false == strpos $value '`' )) {

            //
不处理包含 * 或者使用了 SQL 方法。

    } else {

            $value = '`'.trim
$value .'`'

    }

    if
preg_match "/\b select|insert|update|delete \b/i" $value )) {

           $value = preg_replace
"/\b select|insert|update|delete \b/i" '' $value );

    }

    return $value


}

以上代码分别是phpcmsv9的SQL注入防御以及XSS防御代码。甚至有的应用还有自己的安全中心,如dedecms,提供类似WebShell查杀的功能,如图12-14所示。

图 12-14

一个网站的应用安全防御应该包括对输入的特殊字符过滤、输出过滤、异常访问检测、自身安全检测,等等。其中,自身安全检测方式有:木马查杀、弱后台地址检测、弱口令检测,等等。