我们来谈一谈sql server 中的一个漏洞?: 1='1'
直接上例子:
?
我现在有一张表??users
username | passwd |
dr111 | 123 |
dr456 | 456 |
?
下面我输入这样一条语句:
?
select * from users where?username='asdfad' or 1='1'
?
这条语句看上去应该什么都查不到。但是查询的结果是将上面表中的数据全部查出来了。
?
我们甚至可以写成:
select? * from users where 1='1'
或者
select * from users where 2='2'
?
这些语句的执行效果跟
select * from users 的效果一样。
?
可见我们在java程序中操作数据库时存在 很大的安全问题。
?
在java程序中连接数据库时,PreparedStatement这个接口解决了这个问题。
?
1使用Statement接口
?
Connection ct = null;
??Statement sm = null;
ResultSet rs=null;
?
sm = ct.createStatement();
rs=sm.executeQuery("select * from users where?username='asdfad' or 1='1'");
?
这样一样可以得到所有数据
?
2使用 PreparedStatement接口
?
ps=ct.prepareStatement("select * from users where?username='asdfad' or 1='1'");
?
rs=ps.executeQuery();
?
这样同样的效果
?
?
3 正确的做法应该是这个样子的:
?
ps=ct.prepareStatement("select * from dept where username=?");
ps.setString(1,'dr111');
?
如果写成
ps=ct.prepareStatement("select * from dept where username=?");
ps.setString(1,'adfadf' or 1='1');
?
就不会查出数据。
?
所以最好使用PreparedStatement这个接口用注入的方法来写。
?
?
?
?
?