SQL注入的原理

1:例子

比方说我们在某网站后台登录界面,有两条输入框,一条是帐号一条是密码。那么我们可以猜测数据库中有一个admin表,表里面有两个字段username和password 。这样我们输入用户(比如123)密码(比如456)并提交之后,数据库就会执行一段查询语句:

select id from users where username = '123 and password = '123'

并判断用户名123是错误的(为假)

之后返回帐号密码错误信息。

那么如果我们在用户名处输入'or 1=1-- 而密码随便输入个456呢? 我们来看看数据库中的查询语句:

select id from users where username = '' or 1=1--  and password = '456'

'又 这里呢1=1永远为真,后面 and password = '456'被注释掉了。数据库不需要考虑,这里我们就跳过了验证。

这就是几年前的万能密码,这里只是说说逻辑。我们再来看看下面另一个例子。

二、如何防御sql注入攻击

1.采用预编译语句集,它内置了处理SQL注入的能力,只要使用它的setXXX方法传值即可。

使用好处:

(1).代码的可读性和可维护性.

(2).PreparedStatement尽最大可能提高性能.

(3).最重要的一点是极大地提高了安全性.

String sql= "select * from users where username=? and password=?;  
PreparedStatement preState = conn.prepareStatement(sql);  
preState.setString(1, userName);  
preState.setString(2, password);  
ResultSet rs = preState.executeQuery();

原理:sql注入只对sql语句的准备(编译)过程有破坏作用,而PreparedStatement已经准备好了,执行阶段只是把输入串作为数据处理,而不再对sql语句进行解析,准备,因此也就避免了sql注入问题.

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值