JDBC——SQL注入与解决SQL注入的方法

SQL注入原理

如下列代码

 String sql="select * from t_user where loginName='"+userLoginInfo.get("loginName")+"' and passWord='"+userLoginInfo.get("passWord")+"'";
 rs=s.executeQuery(sql);

在接收用户输入用户名和密码时,如果用户输入用户名为qw,密码输入qw’ or ‘1’='1,则执行的sql语句变为
select * from hero where loginName=‘ji’ and passWord=‘ji’ or ‘1’=‘1’;
由于and的优先级比or要高,而 ‘1’=‘1’恒成立,故该语句将成功执行,而查询的条件是’1’=1,所以会查询所有结果,用户登陆必定成功,这就是SQL注入。

SQL注入解决方法

只要用户提供的信息不参与编译就可以解决SQL注入

所以数据库操作对象用prepareStatement。

 String sql="select * from t_user where loginName=? and passWord=?";
 ps=c.prepareStatement(sql);
         //给占位符传值
ps.setString(1,userLoginInfo.get("loginName"));
ps.setString(2,userLoginInfo.get("passWord"));
//4、执行SQL语句
rs=ps.executeQuery();

上述代码中,执行c.prepareStatement(sql)时,编译器已经将sql语句编译,但不执行,此时sql语句的语义已经固定。
通过setString方法给占位符传值后,用户提交的信息只会在?中,而且会自动加’'扩住(setString方法的功能),如用户再次进行sql注入,则sql语句变成
select * from hero where loginName=‘ji’ and passWord=(‘qw’ or ‘1’=‘1’);
显然,正常情况下该语句执行结果比为空。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值