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 参数检查,特殊字符进行处理(转义)

posted @ 2011-07-25 17:34  how_it_works  阅读(257)  评论(0编辑  收藏  举报