码迷,mamicode.com
首页 > 数据库 > 详细

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

时间:2015-12-02 20:47:13      阅读:255      评论:0      收藏:0      [点我收藏+]

标签:

     那为什么出现以上问题呢?这是程序代码层控制不当导致的。如果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_

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

标签:

原文地址:http://www.cnblogs.com/loleina/p/5013947.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!