数据库安全方面

数据库安全方面

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、返回字符串。

猜你喜欢

转载自www.cnblogs.com/kexinxin/p/10011944.html