我们来谈一谈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这个接口用注入的方法来写。