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