当前位置: 代码迷 >> SQL >> SQL注入原理及预防
  详细解决方案

SQL注入原理及预防

热度:20   发布时间:2016-05-05 13:29:09.0
SQL注入原理及预防

SQL注入原理及预防

?

sql_注入

说明 : 以下内容以mysql为例,其他RDBMS原理一样,但数据库原生函数及SQL语法可能有差异。

一、 注入原理

?我们以登录为例,用户登录时后台会执行SQL语句如下:

select * from auth_user where user_name = '${paramter1}' and password =  '${paramter2}'

?

这时如果我们前台传入到后台的参数是以下情况时:

 ${paramter1}=admin  ${paramter2}=' or true  or '

?那么后台就会执行

 select * from auth_user where user_name='admin' password =' ' or true  or ' ' ;

?

原本不能查出记录(通过验证)的情况下,通过SQL的注入达到了黑客的目的。

以上为SQL注入原理,通过SQL注入可以达到,DB的安装目录、DB管理员密码查看等等目的,所以我们在写代码时要养成良好习惯。接下来我们来讲解SQL注入的防范及原理。

一 、防范原理

select * from auth_user where user_name = '${paramter1}' and password =  '${paramter2}'

?

?

承上SQL注入例子,如果我们对${paramter} 进行相关的验证就可以达到预防的作用。

以java为例:

 String stmtSQL = "select * from auth_user where user_name = ? and password =  ?";           getJdbcTemplate().execute(stmtSQL,new PreparedStatementCallback(){               public Object doInPreparedStatement(PreparedStatement ps)  throws SQLException               {                   //${paramter1}                     ps.setString(1, "admin");                 //${paramter2}                       ps.setString(2, " ' ' or true  or ' ' ");                       ps.execute();                //test code                 return null;               }          });  
?

这段程序的原理是将SQL语句进行参数话

"insert into auth_user(username,password) values(?,?)"

?

将其中的"?"进行参数替换

  //${paramter1}                     ps.setString(1, "admin");                 //${paramter2}                       ps.setString(2, " ' ' or true  or ' ' ");                       ps.execute();  

?

替换的过程一定要注意将特殊的符号进行转义,如:

' = \'" =\"

?

如上程序,最终执行的SQL为

select * from auth_user where password =' \' or true  or \' ' ;

?

结果与我们预期一样。

三、总结

SQL的注入是数据库的基本知识点,所以防范方法已有很多,但是原理其实很简单:

1? 参数话SQL语句

2 参数检查,特殊字符进行处理(转义)

  相关解决方案