提醒:本页面将不再更新、维护或者支持,文章、评论所叙述内容存在时效性,涉及技术细节或者软件使用方面不保证能够完全有效可操作,请谨慎参考!

这算是个老生常谈的问题了,我前面的文章也提到了由此导致的SQL注入漏洞或者XSS跨站漏洞,总结了一下,对于Web有4大漏洞是需要严肃对待的,比如SQL注入、XSS跨站另外还有上传漏洞以及对URL地址处理不严导致的越权漏洞,这个改天单独开一篇文章介绍一下,下面继续谈用户输入过滤不严导致的问题,前天正好帮一个客户处理一个程序问题,一个10年前的计票程序,当然不是我开发的,所以处理起来非常棘手,主要是计票汇总时程序出现了崩溃,仔细研究了这个程序的开发语言,发现是用PowerBuilder构建的,而且留下了PBL文件,用PowerBuilder分析了这个文件,大概知道了BUG的位置。查看了之前录入的数据,发现有个别票选项是0,该软件使用说明上注明只能使用1~4选项,那么说0就是非法的数据选项,那么这个汇总导致程序崩溃的Bug很有可能是由于这个导致的,删除了所有的0选项票,然后再汇总,一切正常!为了切实说明导致Bug的原因,我尝试重现了这个问题,开启一张新选票,然后输入某被选举人票数,输入过程故意输错一项,然后再尝试清除,结果发现无法清除,将该选项设置为0则程序提示“必须为1~4数字”,但是不对0这个无效数据做出处理,也就是说0依旧存在,下一步汇总,结果崩溃如愿的发生了,总结一下,初步判断该程序为“赶工”产品,后期测试不足,所以导致该隐性Bug没有能及时发现。

同样的问题依旧出现在某些网站上,比如经典的SQL注射漏洞,以SQL Server的Transact-SQL语言为例,我们就需要过滤一些危险的字符,比如像单引号,在SQL Server中,如果字符串包含单引号,我们就必须将其转换为两个单引号,避免可能的错误和已知的攻击,参考微软官方的 《SQL 注入》(SQL Injection) 文章,提供下面一个转换单引号的VBScript函数:

Function escapeString(str)
    escapeString = Replace(str, "'", "''")
End Function

对于所有参与拼接SQL语句的字符串来说,都应该通过上面的过滤转换函数进行处理,这样就避免了已知的单引号注入攻击,当然对于LIKE模式查询字符串我们还需要额外处理[、%、_这三个字符:

Function escapeLikeString(str)
  str = Replace(str, "[", "[[]")
  str = Replace(str, "%", "[%]")
  str = Replace(str, "_", "[_]")
  escapeLikeString = escapeString(str)
End Function

更多关于注入防范的技术文章还是参考 微软的文章 吧。

包括XSS安全问题还有上传问题大多是由于过滤不严导致的,有机会我将单独列出来介绍给大家。

2011年12月5日更新

今天某客户遇到一个问题,说是某WEB系统照片上传不上去,跑过去一看,照片格式是JPG的,但是上传时老是提醒格式非法,只支持JPG、GIF和PNG等,我看了一下确实是JPG的,我打开了隐藏的文件扩展名,发现扩展名是大写的JPG,难道是大小写问题?我改成小写的jpg后,上传果然成功了,囧啊。上传扩展名至少忽略大小写判断吧,看来又是一个“赶工”的产品,哦,对了JPG扩展名还有个别称叫JPEG,程序中也要注意处理。