为什么java jdbc问号占位符可以防注入?

如果下载的源码需要作者授权,请更换源码。本站免费分享资源不会增加授权

本篇文章给大家带来的内容是介绍为什么java jdbc问号占位符可以防注入?有一定的参考价值,有需要的朋友可以参考一下,希望对你们有所帮助。

最近几天探讨一下关于sql注入的问题,以前林老师也讲过,现在总结一下:

其实,like是会注入的,也不建议用,用占位符实际查询效果不是like本身的意思,相当全匹配。

建议使用instr()函数,本文主要记录一下处理防止注入的源码,为什么用?可以防注入,而拼接的sql可以注入。

先看下面用占位符来查询的一句话

String sql = "select * from administrator where adminname=?"; psm = con.prepareStatement(sql);
String s_name ="zhangsan' or '1'='1"; psm.setString(1, s_name);

假设数据库表中并没有zhangsan这个用户名,用plsql运行sql语句,可以查出来所有的用户名,但是在Java中并没有查出任何数据,这是为什么呢?

首先,setString()的源码中只有方法名字,并没有任何过程性处理。

那么答案肯定出现在Java到数据库这个过程中,也就是mysql和oracle驱动包中,在mysql驱动包中,PreparedStatement继承并实现了jdk中的setString方法,翻看一下源码,主要是做了转义处理。

也就是原因在于数据库厂商帮你解决了这个问题,下面就看看这个方法的具体实现:

public void setString(int parameterIndex, String x) throws SQLException {  if(x == null) {   setNull(parameterIndex, 1);  } else {   checkClosed();   int stringLength = x.length();   if(connection.isNoBackslashEscapesSet()) {    boolean needsHexEscape = isEscapeNeededForString(x, stringLength);    if(!needsHexEscape) {     byte parameterAsBytes[] = null;     StringBuffer quotedString = new StringBuffer(x.length() + 2);     quotedString.append(''');     quotedString.append(x);     quotedString.append(''');     if(!isLoadDataQuery)      parameterAsBytes = StringUtils.getBytes(quotedString.toString(), charConverter, charEncoding, connection.getServerCharacterEncoding(), connection.parserKnowsUnicode());     else      parameterAsBytes = quotedString.toString().getBytes();     setInternal(parameterIndex, parameterAsBytes);    } else {     byte parameterAsBytes[] = null;     if(!isLoadDataQuery)      parameterAsBytes = StringUtils.getBytes(x, charConverter, charEncoding, connection.getServerCharacterEncoding(), connection.parserKnowsUnicode());     else      parameterAsBytes = x.getBytes();     setBytes(parameterIndex, parameterAsBytes);    }    return;   }   String parameterAsString = x;   boolean needsQuoted = true;   if(isLoadDataQuery || isEscapeNeededForString(x, stringLength)) {    needsQuoted = false;    StringBuffer buf = new StringBuffer((int)((double) x.length() * 1.1000000000000001 D));    buf.append(''');    for(int i = 0; i < stringLength; i++) {     char c = x.charAt(i);     switch(c) {      case 0: // ''       buf.append('\');       buf.append('0');       break;      case 10: // 'n'       buf.append('\');       buf.append('n');       break;      case 13: // 'r'       buf.append('\');       buf.append('r');       break;      case 92: // '\'       buf.append('\');       buf.append('\');       break;      case 39: // '''       buf.append('\');       buf.append(''');       break;      case 34: // '"'       if(usingAnsiMode)        buf.append('\');       buf.append('"');       break;      case 26: // '32'       buf.append('\');       buf.append('Z');       break;      default:       buf.append(c);       break;     }    }    buf.append(''');    parameterAsString = buf.toString();   }   byte parameterAsBytes[] = null;   if(!isLoadDataQuery) {    if(needsQuoted)     parameterAsBytes = StringUtils.getBytesWrapped(parameterAsString, ''', ''', charConverter, charEncoding, connection.getServerCharacterEncoding(), connection.parserKnowsUnicode());    else     parameterAsBytes = StringUtils.getBytes(parameterAsString, charConverter, charEncoding, connection.getServerCharacterEncoding(), connection.parserKnowsUnicode());   } else {    parameterAsBytes = parameterAsString.getBytes();   }   setInternal(parameterIndex, parameterAsBytes);   parameterTypes[(parameterIndex - 1) + getParameterIndexOffset()] = 12;  } }

总结:以上就是本篇文的全部内容,希望能对大家的学习有所帮助。更多相关教程请访问Java视频教程,java开发图文教程,bootstrap视频教程!

本文由(壳先生)整理自网络,如转载请注明出处:https://www.mrshell.com;
本站发布的内容若侵犯到您的权益,请邮件联系 i@mrshell.com 删除,我们将及时处理!
===========================================================================

1. 本站大部分下载资源收集于网络,不保证其完整性以及安全性,请下载后自行测试。
2. 本站资源仅供学习和交流使用,版权归资源原作者所有,请在下载后24小时之内自觉删除。
3. 不得使用于非法商业用途,商用请支持正版!不得违反国家法律,否则后果自负!
4. 若作商业用途,请购买正版,由于未及时购买和付费发生的侵权行为,与本站无关。
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!

=================================================================

壳先生 » 为什么java jdbc问号占位符可以防注入?

发表评论

提供最优质的资源集合

立即查看 了解详情