shirobert 发表于 2016-11-1 09:14:03

sql server 中万能的 1='1'

  我们来谈一谈sql server 中的一个漏洞 : 1='1'
  直接上例子:
  
  我现在有一张表  users
usernamepasswddr111123dr456456  
  下面我输入这样一条语句:
  
  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这个接口用注入的方法来写。
  
  
  
  
  
页: [1]
查看完整版本: sql server 中万能的 1='1'