验证preparedStatement防止SQL注入

本文通过一个安全登录案例,详细介绍了如何使用PreparedStatement防止SQL注入攻击。演示了从修改密码到登录验证的全过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  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语句。


  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.youkuaiyun.com/badyflf/article/details/7926944

内容概要:本文档详细介绍了一个基于MATLAB实现的跨尺度注意力机制(CSA)结合Transformer编码器的多变量时间序列预测项目。项目旨在精准捕捉多尺度时间序列特征,提升多变量时间序列的预测性能,降低模型计算复杂度与训练时间,增强模型的解释性和可视化能力。通过跨尺度注意力机制,模型可以同时捕获局部细节和全局趋势,显著提升预测精度和泛化能力。文档还探讨了项目面临的挑战,如多尺度特征融合、多变量复杂依赖关系、计算资源瓶颈等问题,并提出了相应的解决方案。此外,项目模型架构包括跨尺度注意力机制模块、Transformer编码器层和输出预测层,文档最后提供了部分MATLAB代码示例。 适合人群:具备一定编程基础,尤其是熟悉MATLAB和深度学习的科研人员、工程师和研究生。 使用场景及目标:①需要处理多变量、多尺度时间序列数据的研究和应用场景,如金融市场分析、气象预测、工业设备监控、交通流量预测等;②希望深入了解跨尺度注意力机制和Transformer编码器在时间序列预测中的应用;③希望通过MATLAB实现高效的多变量时间序列预测模型,提升预测精度和模型解释性。 其他说明:此项目不仅提供了一种新的技术路径来处理复杂的时间序列数据,还推动了多领域多变量时间序列应用的创新。文档中的代码示例和详细的模型描述有助于读者快速理解和复现该项目,促进学术和技术交流。建议读者在实践中结合自己的数据集进行调试和优化,以达到最佳的预测效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值