文章来源于网络收集而来,版权归原创者所有,如有侵权请及时联系!
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 ( '"' , '" ; ' , $string ); $string = str_replace ( "'" , '' , $string ); $string = str_replace ( '"' , '' , $string ); $string = str_replace ( ' ; ' , '' , $string ); $string = str_replace ( '<' , '< ; ' , $string ); $string = str_replace ( '>' , '> ; ' , $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 .= '| ( � ( [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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论