数据库安全方面
SQL注入
风险及危害:
SQL注入是一种常见攻击方式,由于开发者采用sql拼凑的方式,用来自网络中不安全的参数形成sql语句访问数据库,攻击者常常采用该漏洞组合成非法的sql语句,使得信息泄露,访问到本来没有权限查看的内容或者直接破坏数据库信息等。发生SQL Injection有以下几种方式:
1) 进入程序的数据来自不可信赖的资源。
2) 数据用于动态构造一个SQL查询。
应对措施:
1) 开发者可以采用带参方式访问sql语句访问数据库,在java中即采用PreparedStatement的方式访问数据库。
2) 如果开发者一定要使用sql拼凑的方式访问数据,对字符串要检查并过滤单引号',对于可能为整形或者浮点类型参数,要先转整形,或者浮点,再进行拼凑。
非安全代码示例
String userid= (String)session.getAttribute("classname");
String param1= request.getParameter("param1");
StringBuffer strbuf=new StringBuffer();
strbuf.append("select * from table1 where userid=");
strbuf.append(userid);
strbuf.append(" and param1='").append(param1).append("'");
String sql=strbuf.toString();
//当param1为 test' or 1=1
那么这条语句就为 select * from table1 where userid=$userid and param1='test' or 1=1这样查询出来的数据就超越了这个用户访问的范围。
安全代码示例
方法一:采用PreparedStatement访问数据库。
String userid= (String)session.getAttribute("classname");
String param1= request.getParameter("param1");
StringBuffer strbuf=new StringBuffer();
String sql= "select * from table1 where userid=? and param1=?";
方法二:检查并过滤特殊字符
String userid= (String)session.getAttribute("classname");
String param1= request.getParameter("param1");
StringBuffer strbuf=new StringBuffer();
strbuf.append("select * from table1 where userid=");
strbuf.append(userid);
strbuf.append(" and param1='")
.append(SqlInjectCheck.checkStringValue(param1)).append("'");
String sql=strbuf.toString();
注:SqlInjectCheck.checkStringValue是公用函数,其实现如下:
1、将'转化成´
2、返回字符串。