返回介绍

12.10 应用自身的安全中心

发布于 2024-10-11 22:07:49 字数 4505 浏览 0 评论 0 收藏 0

虽然现在基于主机 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

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文