sql注入
漏洞名称 |
SQL注入漏洞 |
漏洞原理 |
通过构建特殊的输入作为参数传入Web应用程序,而这些输入大都是SQL语法里的一些组合, 通过执行SQL语句进而执行攻击者所要的操作,其主要原因是程序没有细致地过滤用户输入的数据,致使非法数据侵入系统。 |
漏洞分类 |
1. 平台层SQL注入: 不安全的数据库配置或数据库平台的漏洞所致 2. 代码层SQL注入: 程序员对输入未进行细致地过滤从而执行了非法的数据查询 |
产生原因 |
1. 不当的类型处理; 2. 不安全的数据库 3. 不合理的查询集处理 4. 不当的错误处理; 5. 转义字符处理不合适; 6. 多个提交处理不当。 |
防护建议 |
1.对用户的输入进行校验,可以通过正则表达式,或限制长度;对单引号和 双"-"进行转换等。 2.不要使用动态拼装sql,可以使用参数化的sql 3.不要使用管理员权限的数据库连接,为每个应用使用单独的权限有限的数据库连接。 4.不要把机密信息直接存放,加密或者hash掉密码和敏感的信息。 5.应用的异常信息应该给出尽可能少的提示,最好使用自定义的错误信息对原始错误信息进行包装。 |
流程建议 |
在部署应用系统前,始终要做安全审评。建立一个正式的安全过程,并且每次做更新时,要对所有的编码做审评。 开发队伍在正式上线前会做很详细的安全审评,然后在几周或几个月之后他们做一些很小的更新时, 他们会跳过安全审评这关, “就是一个小小的更新,我们以后再做编码审评好了”。请始终坚持做安全审评 |
举例 |
其中字符串willey由前端输入, willey->O’willey
|
如何防止SQL注入 |
SQL拼接方式的结构: 定义查询结构 String queryText = “select ename, sal from emp where ename = ‘”; 拼接查询语句 queryText += request.getParameter(“name”); queryTrxt + =”’”; 执行查询 Stmt = con.createStatement(); Rs = stmt.exceuteQuery(queryText); 使用参数绑定的办法: String queryText = “select ename, sal from emp where ename = ?”; 使用数据库连接”con”预处理语句 Stmt = con.prepareStatement(queryText); Stmt.setString(1, request.getParameter(“name”))
|
编码规范 |
JAVA: 不允许直接根据用户输入的参数拼接sql的情况出现,直接使用PreparedStatement进行sql的查询; 并且需要对输入的参数进行特殊字符的过滤。使用Hibernate等框架的,可以使用参数绑定等方式操作sql语句。 |