当前位置: 首页 > news >正文

java web sql注入测试(3)---现象分析

     那为什么出现以上问题呢?这是程序代码层控制不当导致的。如果web前端对输入数据控制严格,会对数据库进行操作的字符串,在客户端做敏感字符转义处理,或者在操作数据库的dao层,使用动态参数的sql,不使用拼接方式的sql,都可以防止该类问题的发生。

    一般情况,如果测试人员了解dao层的具体设计,如果使用的就是非拼接方式的,基本是可以拦截大部分这些存在问题的sql了。而如果使用的是拼接方式,就可以好好的设计测试用例,进行测试了。

   那又为什么非拼接方式就可以有效的防止SQL注入测试呢?

修改上部分核心代码块,采用动态sql(预编译sql方式): 

String hql="delete from Department where name=?";

Query query = session.createQuery(hql);

query.setString(0, name);

 同样输入的代码存在问题:

 可是结果却没有删除。为什么呢?

   因为在setString方法中实现了对字符串中敏感字符的转义。Jdk提供PreparedStatemen接口,在mysql的jar包中,PreparedStatement实现了jdk中的PreparedStatement,里面的setString方法如下:

  1. public void setString(int parameterIndex, String x) throws SQLException {  
  2.         // if the passed string is null, then set this column to null  
  3.         if (x == null) {  
  4.             setNull(parameterIndex, Types.CHAR);  
  5.         } else {  
  6.             StringBuffer buf = new StringBuffer((int) (x.length() * 1.1));  
  7.             buf.append('\'');  
  8.   
  9.             int stringLength = x.length();  
  10.               //  
  11.             // Note: buf.append(char) is _faster_ than  
  12.             // appending in blocks, because the block  
  13.              // append requires a System.arraycopy()....  
  14.             // go figure...  
  15.             //  
  16.             for (int i = 0; i < stringLength; ++i) {  
  17.                  char c = x.charAt(i);  
  18.    
  19.                 switch (c) {  
  20.                case 0: /* Must be escaped for 'mysql' */  
  21.                      buf.append('\\');  
  22.                     buf.append('0');  
  23.    
  24.                    break;  
  25.  
  26.                  case '\n': /* Must be escaped for logs */  
  27.                     buf.append('\\');  
  28.                     buf.append('n');  
  29.    
  30.                    break;  
  31.    
  32.                 case '\r':  
  33.                      buf.append('\\');  
  34.                      buf.append('r');  
  35.    
  36.                      break;  
  37.    
  38.                  case '\\':  
  39.                      buf.append('\\');  
  40.                      buf.append('\\');  
  41.    
  42.                      break;  
  43.    
  44.                  case '\'':  
  45.                      buf.append('\\');  
  46.                      buf.append('\'');  
  47.    
  48.                      break;  
  49.    
  50.                  case '"': /* Better safe than sorry */  
  51.                      if (this.usingAnsiMode) {  
  52.                          buf.append('\\');  
  53.                     }  
  54.    
  55.                      buf.append('"');     
  56.                      break;  
  57.    
  58.                  case '\032': /* This gives problems on Win32 */  
  59.                      buf.append('\\');  
  60.                      buf.append('Z');  
  61.    
  62.                      break;  
  63.                  default:  
  64.                     buf.append(c);  
  65.                  }  
  66.              }  
  67.    
  68.              buf.append('\'');  
  69.    
  70.              String parameterAsString = buf.toString();  
  71.    
  72.              byte[] parameterAsBytes = null;  
  73.    
  74.              if (!this.isLoadDataQuery) {  
  75.                  parameterAsBytes = StringUtils.getBytes(parameterAsString,  
  76.                          this.charConverter, this.charEncoding, this.connection  
  77.                                  .getServerCharacterEncoding(), this.connection  
  78.                                  .parserKnowsUnicode());  
  79.              } else {  
  80.                  // Send with platform character encoding  
  81.                  parameterAsBytes = parameterAsString.getBytes();  
  82.              }  
  83.    
  84.              setInternal(parameterIndex, parameterAsBytes);  
  85.          }  
  86.     } 

     Hql进行动态参数绑定也存在很多种其他方法:按参数名称绑定,按参数位置绑定, setParameter()方法等等。http://baike.baidu.com/link?url=NKt6I-Gk0HnyFRWyZ0_ZuDe0pz_aDqVul-VDJZCDCGl9K5LsBghBfxhPVJmZh9qmBKtXgY2EqAqK1oQUNK2Su_

转载于:https://www.cnblogs.com/loleina/p/5013947.html

相关文章:

  • Android学习笔记之广播意图及广播接收者MyBroadcastReceiver、Broadcast
  • 一些简单的shell脚本实例 转
  • xUtils简介及其使用方法
  • OC基础(20)
  • Android框架Picasso介绍
  • Assets遇到的问题
  • 直接拿来用!最火的Android开源项目(一)
  • python --循环对象
  • Oracle中用触发器实现自动记录表数据被修改的历史信息
  • 直接拿来用!最火的Android开源项目(完结篇)
  • 睡前小dp-codeforce414B-dp+一点点想法
  • SlidingMenu-master中的example怎样导入eclipse运行
  • echarts.js
  • 使用Genymotion调试出现错误INSTALL_FAILED_CPU_ABI_INCOMPATIBLE解决办法
  • 使用Preference保存设置
  • hexo+github搭建个人博客
  • 【Linux系统编程】快速查找errno错误码信息
  • 【每日笔记】【Go学习笔记】2019-01-10 codis proxy处理流程
  • Android开发 - 掌握ConstraintLayout(四)创建基本约束
  • Laravel 中的一个后期静态绑定
  • Linux gpio口使用方法
  • pdf文件如何在线转换为jpg图片
  • Python实现BT种子转化为磁力链接【实战】
  • Service Worker
  • SpiderData 2019年2月16日 DApp数据排行榜
  • SpriteKit 技巧之添加背景图片
  • 测试如何在敏捷团队中工作?
  • 短视频宝贝=慢?阿里巴巴工程师这样秒开短视频
  • 汉诺塔算法
  • 机器学习 vs. 深度学习
  • 如何选择开源的机器学习框架?
  • 想使用 MongoDB ,你应该了解这8个方面!
  • 走向全栈之MongoDB的使用
  • Python 之网络式编程
  • 正则表达式-基础知识Review
  • #[Composer学习笔记]Part1:安装composer并通过composer创建一个项目
  • #多叉树深度遍历_结合深度学习的视频编码方法--帧内预测
  • #我与Java虚拟机的故事#连载05:Java虚拟机的修炼之道
  • $.extend({},旧的,新的);合并对象,后面的覆盖前面的
  • (1)虚拟机的安装与使用,linux系统安装
  • (C#)if (this == null)?你在逗我,this 怎么可能为 null!用 IL 编译和反编译看穿一切
  • (Mac上)使用Python进行matplotlib 画图时,中文显示不出来
  • (附源码)springboot金融新闻信息服务系统 毕业设计651450
  • (附源码)ssm基于jsp高校选课系统 毕业设计 291627
  • (一)【Jmeter】JDK及Jmeter的安装部署及简单配置
  • .form文件_SSM框架文件上传篇
  • .NET 5.0正式发布,有什么功能特性(翻译)
  • .NET/C# 的字符串暂存池
  • .NET开发者必备的11款免费工具
  • .NET面试题解析(11)-SQL语言基础及数据库基本原理
  • .net之微信企业号开发(一) 所使用的环境与工具以及准备工作
  • :如何用SQL脚本保存存储过程返回的结果集
  • @Autowired自动装配
  • @Bean注解详解
  • [ vulhub漏洞复现篇 ] Celery <4.0 Redis未授权访问+Pickle反序列化利用