欢迎访问玛尊真服务平台,本站唯一网址:www.isodyi.com,未经明确书面许可,任何人不得擅自使用“玛尊真”等商标。
玛尊真ISO认证服务公司

再看ibatisOrderBy注入问题

接上文
http://blog.itpub.net/29254281/viewspace-1318239/

领导让开发同学鼓捣一个可配置化的后台.
又回到了原来的问题
如果要灵活,很多参数要从前端页面传过来,有SQL注入的风险.
如果参数化SQL,又很难做到灵活..

先看一个注入的例子:

  1. import java.sql.Connection;  
  2. import java.sql.DriverManager;  
  3. import java.sql.ResultSet;  
  4. import java.sql.SQLException;  
  5. import java.sql.Statement;  
  6.   
  7. public class Test {  
  8.     public static void main(String[] args) throws SQLException {  
  9.         String para="/index.html' union all select * from probe -- ";  
  10.         Connection conn = DriverManager.getConnection("jdbc:MySQL://127.0.0.1:3306/mvbox", "xx", "xx");  
  11.           
  12.         Statement ps=conn.createStatement();  
  13.   
  14.         ResultSet rs = ps.executeQuery("select * from probe where path='"+para+"'");  
  15.         while (rs.next()) {  
  16.             System.out.println(rs.getString("host")+":"+rs.getString("path"));  
  17.         }  
  18.         rs.close();  
  19.         ps.close();  
  20.         conn.close();  
  21.     }  

如果要避免这种风险,可以选择参数化
  1. import java.sql.Connection;  
  2. import java.sql.DriverManager;  
  3. import java.sql.PreparedStatement;  
  4. import java.sql.ResultSet;  
  5. import java.sql.SQLException;  
  6.   
  7. public class Test {  
  8.     public static void main(String[] args) throws SQLException {  
  9.         String para="/index.html' union all select * from probe -- ";  
  10.         Connection conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/mvbox", "xx", "xx");  
  11.         PreparedStatement ps=conn.prepareStatement("select * from probe where path=?");  
  12.         ps.setString(1, para);  
  13.         ResultSet rs=ps.executeQuery();  
  14.         while (rs.next()) {  
  15.             System.out.println(rs.getString("host")+":"+rs.getString("path"));  
  16.         }  
  17.         rs.close();  
  18.         ps.close();  
  19.         conn.close();  
  20.     }  

为何参数化可以防止注入?
作为MySQL JDBC驱动来说(5.1.31),其实就是对敏感字符做了转义.

观察 com.mysql.jdbc.PreparedStatement 的 setString方法

可以看到有如下的替换过程

  1.               String parameterAsString = x;  
  2.             boolean needsQuoted = true;  
  3.               
  4.             if (this.isLoadDataQuery || isEscapeNeededForString(x, stringLength)) {  
  5.                 needsQuoted = false; // saves an allocation later  
  6.                   
  7.                 StringBuffer buf = new StringBuffer((int) (x.length() * 1.1));  
  8.                   
  9.                 buf.append('\'');  
  10.       
  11.                 //  
  12.                 // Note: buf.append(char) is _faster_ than  
  13.                 // appending in blocks, because the block  
  14.                 // append requires a System.arraycopy()....  
  15.                 // go figure...  
  16.                 //  
  17.       
  18.                 for (int i = 0; i < stringLength; ++i) {  
  19.                     char c = x.charAt(i);  
  20.       
  21.                     switch (c) {  
  22.                     case 0: /* Must be escaped for 'mysql' */  
  23.                         buf.append('\\');  
  24.                         buf.append('0');  
  25.       
  26.                         break;  
  27.       
  28.                     case '\n': /* Must be escaped for logs */  
  29.                         buf.append('\\');  
  30.                         buf.append('n');  
  31.       
  32.                         break;  
  33.       
  34.                     case '\r':  
  35.                         buf.append('\\');  
  36.                         buf.append('r');  
  37.       
  38.                         break;  
  39.       
  40.                     case '\\':  
  41.                         buf.append('\\');  
  42.                         buf.append('\\');  
  43.       
  44.                         break;  
  45.       
  46.                     case '\'':  
  47.                         buf.append('\\');  
  48.                         buf.append('\'');  
  49.       
  50.                         break;  
  51.       
  52.                     case '"': /* Better safe than sorry */  
  53.                         if (this.usingAnsiMode) {  
  54.                             buf.append('\\');  
  55.                         }  
  56.       
  57.                         buf.append('"');  
  58.       
  59.                         break;  
  60.       
  61.                     case '\032': /* This gives problems on Win32 */  
  62.                         buf.append('\\');  
  63.                         buf.append('Z');  
  64.       
  65.                         break;  
  66.   
  67.                     case '\u00a5':  
  68.                     case '\u20a9':  
  69.                         // escape characters interpreted as backslash by mysql  
  70.                         if(charsetEncoder != null) {  
  71.                             CharBuffer cbuf = CharBuffer.allocate(1);  
  72.                             ByteBuffer bbuf = ByteBuffer.allocate(1);   
  73.                             cbuf.put(c);  
  74.                             cbuf.position(0);  
  75.                             charsetEncoder.encode(cbuf, bbuf, true);  
  76.                             if(bbuf.get(0) == '\\') {  
  77.                                 buf.append('\\');  
  78.                             }  
  79.                         }  
  80.                         // fall through  
  81.   
  82.                     default:  
  83.                         buf.append(c);  
  84.                     }  
  85.                 }  
  86.       
  87.                 buf.append('\'');  
  88.       
  89.                 parameterAsString = buf.toString();  
  90.             } 


是不是可以使用 iBatis 的 $ 方式 增加灵活性,而在参数进入iBatis之前,手工进行一下敏感字符替换,而防止SQL注入攻击呢?
上一篇:没有了
快速申请办理
称呼: *
电话: *

订单提交后,10分钟内,我们将安排工作人员和您联系!

热点资讯
联系我们
大悟县玛尊真商贸有限公司
电   话:0712-7218610

传   真:0712-7218610

谭经理:18980820575

王主任:135 1821 9792

邮   箱:631063699@qq.com

地   址:湖北省孝感市大悟县城关镇鄂北物流城13栋125号

微信二维码
扫一扫 关注我们
电话:

189-8208-1108

湖北省孝感市大悟县城关镇鄂北物流城13栋125号八戒云创空间-D1-430

ISO体系认证
iso认证
服务体系认证
有机产品认证
OHSAS18001
ITSS认证
信用评级
中国招标企业信用认证
资信等级
重合同守信用
企业信用认证
中国诚信供应商
质量、服务诚信认证
CMMI
CMMI1
CMMI2
CMMI3
CMMI4
CMMI5
系统集成
系统集成一级
信息系统集成二级
信息系统集成三级
信息系统集成四级
涉密信息系统集成
资质许可证
生产许可证认证
GS认证
CCC认证
中国节能认证
十环认证
知识产权

Copyright © 2002-2025

大悟县玛尊真商贸有限公司 版权所有

备案/许可证号:鄂ICP备2025140345号-7   网站建设创新互联
 
QQ在线咨询
客服咨询
咨询热线
189-8208-1108