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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值