验证preparedStatement防止SQL注入

来源:互联网 发布:有人买过淘宝店吗 编辑:程序博客网 时间:2024/06/07 02:35
[sql] view plain copy
  1. mysql> select * from t_u  
  2.     -> ;  
  3. +----+----------+------+------+  
  4. | id | username | pwd  | age  |  
  5. +----+----------+------+------+  
  6. |  1 | zs       | test |   22 |  
  7. +----+----------+------+------+  
  8. 1 row in set (0.14 sec)  
  9.   
  10. mysql> update t_u set pwd = 'ddd\' or \'1\'=\'1' where id =1;  
  11. Query OK, 1 row affected (0.39 sec)  
  12. Rows matched: 1  Changed: 1  Warnings: 0  
  13.   
  14. mysql> select * from t_u;  
  15. +----+----------+----------------+------+  
  16. | id | username | pwd            | age  |  
  17. +----+----------+----------------+------+  
  18. |  1 | zs       | ddd' or '1'='1 |   22 |  
  19. +----+----------+----------------+------+  
  20. 1 row in set (0.06 sec)  
java:
[javascript] view plain copy
  1. package web;  
  2.   
  3. import java.io.IOException;  
  4. import java.sql.Connection;  
  5. import java.sql.PreparedStatement;  
  6. import java.sql.ResultSet;   
  7.   
  8. import javax.servlet.ServletException;  
  9. import javax.servlet.http.HttpServlet;  
  10. import javax.servlet.http.HttpServletRequest;  
  11. import javax.servlet.http.HttpServletResponse;  
  12.    
  13.   
  14. import util.DBUtil;  
  15.   
  16. public class LoginServletSafe extends HttpServlet{   
  17.         public void service(HttpServletRequest req,  
  18.                                 HttpServletResponse res)  
  19.                 throws ServletException,IOException{   
  20.             System.out.println("========================");  
  21.             Connection conn =null;    
  22.             try{  
  23.                 conn = DBUtil.getConnection();   
  24.             String username = req.getParameter("username");  
  25.             String pwd =req.getParameter("pwd");   
  26.             String sql="select * from t_u where username = ? and pwd = ?";  
  27.             System.out.println(sql);   
  28.             PreparedStatement prep= conn.prepareStatement(sql);   
  29.             prep.setString(1, username);  
  30.             prep.setString(2, pwd);   
  31.             //System.out.println("pwd的值:"+pwd);  
  32.             //若将pwd的值定义为:ddd' or '1'='1   
  33.             //通过preparedStatement预编译后,执行的SQL语句将是:  
  34.             //select * from t_u where name = 'zs'   
  35.             // and pwd ='ddd\' or \'1\'=\'1'  
  36.               
  37.              /**实现机制不同,注入只对sql语句的准备(编译?)过程有破坏作用 
  38.                 而ps已经准备好了,执行阶段只是把输入串作为数据处理,不再 
  39.                 需要对sql语句进行解析,准备,因此也就避免了sql注入问题. 
  40.                  
  41.                 *PreparedStatement可以在传入sql后,执行语句前,给参数赋值, 
  42.                 *避免了因普通的拼接sql字符串语句所带来的安全问题,而且准备sql 
  43.                 *和执行sql是在两个语句里面完成的,也提高了语句执行的效率 
  44.                 */  
  45.             ResultSet rst= prep.executeQuery();  
  46.               
  47.             System.out.println("rst: "+rst);  
  48.             //System.out.println("rst: "+rst.getStatement());  
  49.             //判断结果集rs是否有记录,并且将指针后移一位  
  50.             //因为前面的select语句是限定的条件,只有满足了条件才能有记录产生  
  51.             if(rst.next()){     
  52.                 System.out.println("success");  
  53.             }else{  
  54.                 System.out.println("fail");  
  55.             }  
  56.               
  57.             }catch(Exception e){  
  58.                 e.printStackTrace();  
  59.                 throw new ServletException(e);  
  60.             }  
  61.               
  62.               
  63.         }  
  64.   
  65.   
  66. }  

然后在JSP页面中,name的取值为zs,pwd的取值为:ddd' or '1'='1 

提交后,控制台打印出:success,就表示,pwd的值是当成参数值来传递了,相当于执行了以下的SQL语句。


[sql] view plain copy
  1. mysql> select * from t_u where username='zs' and pwd = 'ddd\' or \'1\'=\'1';  
  2. +----+----------+----------------+------+  
  3. | id | username | pwd            | age  |  
  4. +----+----------+----------------+------+  
  5. |  1 | zs       | ddd' or '1'='1 |   22 |  
  6. +----+----------+----------------+------+  
  7. 1 row in set (0.00 sec)  

验证完毕,一直纠结网络上也没有这么的详细的解释,自己弄明白后,豁然开朗。^_^

来自:http://blog.csdn.net/badyflf/article/details/7926944

0 0
原创粉丝点击