注入攻击漏洞,例如SQL,OS以及LDAP注入。这些攻击发生在当不可信的数据作为命令或者查询语句的一部分,被发送给解释器的时候。攻击者发送的恶意数据可以欺骗解释器,以执行计划外的命令或者在未被恰当授权时访问数据。
防止注入漏洞需要将不可信数据从命令及查询中区分开。
- 白名单验证(包含验证或者正验证): 数据类型、 数据大小、 数据范围、 数据内容
- 黑名单:常用方法为正则表达式(推荐使用白名单)
- 使用存储过程:可以防止或减轻SQL注入影响的设计技术(几乎可以杜绝SQL注入);
存储过程非常有助于减轻潜在SQL注入漏洞的严重影响,因为大多数数据库中使用存储过程时可以在数据库层配置访问控制;发现SQL注入时,可以通过正确的配置来保证攻击者无法访问数据的敏感信息。- 使用抽象层:常见做法是为表示、业务逻辑、和数据访问定义不同的层,从而将每一层的实现从总体设计中抽象出来。
处理敏感数据:考虑数据库中敏感信息的存储和访问
- 口令:存储每个用户的口令的salted单向哈希而不是口令本身,将salt(一种附加的少量随机数数据)与哈希口令分开保存;登录时不用比较用户口令和数据库保存的口令,而是通过用户提供的信息计算出salted哈希与数据库中保存的哈希值进行比较(如果用户忘记了口令,则生成一个新的口令给用户)。
- 信用卡及其他财务信息:使用认可的(FIPS认证过)加密算法来对信用卡等信息进行加密,存储加密后的明细数据。
- 存档:考虑每隔一段合理的时间就存档或清除这些不需要的信息。
- 避免明显的对象名:为关键对象(加密函数、口令、信用卡列)选取名称是需要格外小心,eg:password
- 创建数据库honeypot:有人在尝试从数据库中读取口令时接收警告,则可以创建一种带password(包含假数据)的附加honeypot(蜜罐),如果假数据被选中,那么发送邮件给应用管理员。
- 附加安全的开发资源:借助资源向开发人员提供工具、资源、培训和知识,提高安全性。
- 使用运行时保护(成本):检测、减轻或防止那些不需要重编译易受攻击的应用的源码,即可部署的SQL注入。
- Web应用防火墙:(WAF:网络设备或将安全性加到Web应用中的一种解决方案)
- 截断过滤器:在请求资源的核心处理之前或之后执行处理操作。
- 不可编辑的输入保护和可编辑的输入保护
- URL策略/页面层策略
页面覆写:创建一个在运行时接受的替代页面或类
URL重写:接收那些发送给易受攻击页面或URL请求,并将他们重定向该页面的替代版本- 资源代理/封装
- 面向方面编程
- 应用入侵检测系统
- 数据库防火墙
- 确保数据库安全
- 使用较低权限的数据库登录
- 撤销PUBLIC许可
- 使用存储过程
- 使用强大的加密技术来保护存储的敏感数据
- 维护一个审查跟踪
- 确保数据库安全
- 额外的系统对象锁定
- 约束即席查询
- 增强对验证周边的控制
- 在最低权限的操作系统账户语境中运行
- 确保数据库服务器打了补丁
- 额外的部署考虑
- 最小化不必要信息泄露
- 隐藏错误信息
- 使用空的默认Web站点
- 为DNS反向查询使用虚拟主机名称
- 使用通配符SSL证书
- 限制通过搜索引擎hacking得到的发现
- 禁止WSDL信息
- 提高Web服务器日志的冗余
- 在独立主机上部署Web服务器和数据库服务器
- 配置网络访问控制
Function LDAPRequest(id) LDAPRequest = checkLDAP(Request(id)) end function '防止LDAP的注入 Function checkLDAP(strHTML) If Isnull(strHTML) Then checkLDAP = "" Exit Function End If strHTML=server.HTMLEncode(strHTML) Dim objRegExp,strOutput Set objRegExp=New Regexp objRegExp.IgnoreCase=true objRegExp.Global=True objRegExp.Pattern = Chr(0) strOutput = objRegExp.Replace(strHTML, "") objRegExp.Pattern = """" strOutput = objRegExp.Replace(strOutput, """) objRegExp.Pattern = "\\" strOutput = objRegExp.Replace(strOutput, "\5c") objRegExp.Pattern = "NUL" strOutput = objRegExp.Replace(strOutput, "\0") objRegExp.Pattern = "/" strOutput = objRegExp.Replace(strOutput, "\2f") objRegExp.Pattern = "\*" strOutput = objRegExp.Replace(strOutput, "\2a") objRegExp.Pattern = "\(" strOutput = objRegExp.Replace(strOutput, "\28") objRegExp.Pattern = "\)" strOutput = objRegExp.Replace(strOutput, "\29") Set objRegExp=Nothing checkLDAP = strOutput end function