疑问1:为什么IBatis解决了大部分的sql注入?(实际上还有部分sql语句需要关心sql注入,比如like)

  之前写Java web,一直使用IBatis,从来没有考虑过sql注入;最近写php(新手),突然遇到一大堆sql注入问题,如sql语句:

SELECT * FROM message WHERE message_id =$id;

id通常允许输入数字或字符,如果用户输入了5' OR '1'='1,被执行的sql语句就变成了

SELECT * FROM message WHERE message_id = '5' OR '1'='1';

返回了整个库记录,更有甚者,用户输入5';DELETE FROM message WHERE message_id='10 被执行的sql变成了

SELECT * FROM message WHERE message_id = '5';DELETE FROM message WHERE message_id='10';

将有记录被直接删除,甚至危害整个数据库。在php开发中通常需要程序员写附加的代码保证,主要有三类方法:1)使用intval转换字符串为值;2)过滤关键字(不推荐);3)使用转义字符转义特殊字符(如单引号、双引号和百分号等),今天突然想到为什么Java web使用ibatis就不需要程序员来防止这些注入问题呢?

Ibatis执行sql步骤:      1)预编译

2)替换占位符变量

3)执行sql

对于sql语句:

SELECT * FROM message WHERE message_id =#id#;

id为map中的key或者message bean中的属性,在预编译过程后,sql语句变成

SELECT * FROM message WHERE message_id =?;

?是占位符,代表这个变量需要在执行前替换,在替换占位符的过程中,ibatis会将特殊字符转义为普通字符,如'变成\'、%变成\%,这样被注入的语句就变成

SELECT * FROM message WHERE message_id = '5\' OR \'1\'=\'1';

执行结果还是原结果或者sql报错,不会出现被注入情况。

延伸:

在ibatis中,有两种书写变量的方式:

1)SELECT * FROM message WHERE message_id =#id#;

   2)SELECT * FROM message WHERE message_id =$id$;

第一种方式是加双引号并转义特殊字符的方式替换变量,第二种方式是直接替换变量。比如order by topicId , 语句这样写... order by #xxx# ibatis 就会把他翻译成order by 'topicId' (这样就会报错) 语句这样写... order by $xxx$ ibatis 就会把他翻译成order by topicId。

看了网上的其它帖子,都讲到了name like '%$name$%' 这种用法需要用CONCAT('%',#param#,'%')来替换,这里就不再展开,只需要在写xml配置文件的时候注意就行。

总结起来就是一句话,$符的字符串连接方式不安全,#符的加单引号并转义特殊字符的方式是安全的。

Ibatis自动解决sql注入机制的更多相关文章

  1. (转载)ibatis:解决sql注入问题

    原文地址:http://blog.csdn.net/scorpio3k/article/details/7610973 对于ibaits参数引用可以使用#和$两种写法,其中#写法会采用预编译方式,将转 ...

  2. IBatis.Net使用总结(一)-- IBatis解决SQL注入(#与$的区别)

    IBatis解决SQL注入(#与$的区别) 在IBatis中,我们使用SqlMap进行Sql查询时,需要引用参数,在参数引用中可以使用两种占位符#和$.这两种占位符有什么区别呢? (1):#***#, ...

  3. 解决 SQL 注入的另类方法

    本文是翻译,版权归原作者所有 原文地址(original source):https://bitcoinrevolt.wordpress.com/2016/03/08/solving-the-prob ...

  4. PreparedStatement解决sql注入问题

    总结 PreparedStatement解决sql注入问题 :sql中使用?做占位符 2.得到PreparedStatement对象 PreparedStatement pst=conn.prepar ...

  5. 使用过滤器解决SQL注入和跨站点脚本编制

    1 SQL注入.盲注 1.1 SQL注入.盲注概述 Web 应用程序通常在后端使用数据库,以与企业数据仓库交互.查询数据库事实上的标准语言是 SQL(各大数据库供应商都有自己的不同版本).Web 应用 ...

  6. MyBatis是如何解决Sql注入的

    转:[转]mybatis如何防止sql注入 java中预处理PrepareStatement为什么能起到防止SQL注入的作用??!! 一.SQL注入 sql注入大家都不陌生,是一种常见的攻击方式,攻击 ...

  7. MySQL_(Java)使用preparestatement解决SQL注入的问题

    MySQL_(Java)使用JDBC向数据库发起查询请求 传送门 MySQL_(Java)使用JDBC创建用户名和密码校验查询方法 传送门 MySQL数据库中的数据,数据库名garysql,表名gar ...

  8. JDBC_08_解决SQL注入问题 (登录和注册)

    解决SQL注入问题 只要用户提供的信息不参与sql语句的编译过程,那么尽管用户输入的信息中含有sql关键字那么也不会起作用了 要想使用户提供信息不参与sql语句的编译过程,那么必须使用 java.sq ...

  9. jdbc 07: 解决sql注入

    jdbc连接mysql,解决sql注入问题 package com.examples.jdbc.o7_解决sql注入; import java.sql.*; import java.util.Hash ...

随机推荐

  1. session 在PC端正常设置读取,在移动端无法正常读取

    一.背景 最近在做一个面向三端[H5.IOS.安卓]的短信验证码登录接口.发送短信验证码时,服务端通过 session 保存验证码的值.登录时,从 session 获取验证码和用户输入的验证码 相比较 ...

  2. JAVA基础之Servlet

    个人理解: servlet是用Java编写的服务器端程序,具有独立于平台和协议的特性,主要功能在于交互式地浏览和生成数据,生成动态Web内容.需要注意的在创建的服务器端的目录和实际上存在差别的,并且访 ...

  3. adb命令获取app布局文件xml

    adb shell /system/bin/uiautomator dump --compressed /data/local/tmp/uidump.xml adb pull /data/local/ ...

  4. Chrome谷歌浏览器插件-小结

    1.小插件库: Tampermonkey https://chrome.google.com/webstore/detail/tampermonkey-beta/gcalenpjmijncebpfij ...

  5. expect脚本远程登录、远程执行命令和脚本传参简单用法

    expect介绍: 最近想写一个自动化安装脚本,涉及到远程登录.分发文件包.远程执行命令等,其中少不了来回输入登录密码,交互式输入命令等,这样就大大降低了效率,那么有什么方法能解决呢?不妨试试expe ...

  6. 设置Layer模态框的 z-index

    $.get(url, {}, function(data){ layui.use(['layer'],function () { var layer = layui.layer,$=layui.$; ...

  7. Android笔记(三十六) AsyncTask是如何执行的?

    在上一个例子中,我们是在LoadImage的onPostExecute中修改的UI,不是说只允许在主线程中修改UI吗?我们看一下源代码是如何操作的. MainActicity.java package ...

  8. python解析传入的命令行参数 argv

    python解析命令行参数主要有三种方法:sys.argv.argparse解析.getopt解析 方法一:sys.argv —— 命令行执行:python test_命令行传参.py 1,2,3 1 ...

  9. 关于MQ的几件小事:消息队列的用途、优缺点、技术选型

    原文:https://www.cnblogs.com/jack1995/p/10908789.html 1.为什么使用消息队列? (1)解耦:可以在多个系统之间进行解耦,将原本通过网络之间的调用的方式 ...

  10. 剑指offer:用两个栈实现一个队列

    题目 用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型. 解题思路 用一个栈A来保存入栈,当要出栈的时候,将栈A的元素按照栈后进先出的特点转移到栈B中(此时栈A为空了 ...