疑问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. HTML学习摘要4

    DAY 4 text-align 属性规定了元素中文本的水平对齐方式: <html> <body> <h1 style="text-align:center&q ...

  2. Oracle 检索数据(查询数据、select语句)

    用户对表或视图最常进行的操作就是检索数据,检索数据可以通过 select 语句来实现,该语句由多个子句组成,通过这些子句完成筛选.投影和连接等各种数据操作,最终得到想要的结果. 语法: select ...

  3. self attention pytorch代码

    实现细节; 1.embedding 层 2.positional encoding层:添加位置信息 3,MultiHeadAttention层:encoder的self attention 4,sub ...

  4. JS 中Json常用操作

    转自: https://www.jianshu.com/p/6501b0f3124f 直接定义json var json = {"name": "小明", &q ...

  5. zabbix Server 4.0 监控TCP的12种状态

      zabbix Server 4.0 监控TCP的12种状态 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 大家对TCP三次握手比较熟悉了,都知道当发生DOSS攻击时,客户端发送 ...

  6. Django中多对多关系的orm表设计

    作者的管理 1.设计表结构 出版社 书籍 作者 一个出版社出版多个书籍  1对多 书籍和作者的关系:一个作者写多本书,一本书可以是多个作者写.多对多 1)创建一张表,表中多对多的数据关系.使用 多对多 ...

  7. mysql_safe和mysql_multi

    1 mysql_safe 原理 mysqld_safe其实为一个shell脚本(封装mysqld),启动时需要调用server和database(即/bin和/data目录),因此需要满足下述条件之一 ...

  8. 复习整理(一)——HDFS

    1.问题 分布式文件系统那么多,为什么hadoop项目中还要开发一个分布式文件系统呢? 2.存储模型 文件线性字节切割成块(Block),具有offset,id 文件与文件的block大小可以不一样 ...

  9. Kotlin使用处协变的意义与用法

    在上一次https://www.cnblogs.com/webor2006/p/11294849.html中对于Java的协变和Kotlin的协变提到了它们的区别,回忆一下: 其实在Kotlin中也有 ...

  10. readme.txt 为什么我们不重视

    1.很多源码项目下面都有编译说明,readme 2.我们的电脑上每个目录都有很多文件,我们似乎可以建立一个readme.txt 知道是什么 节约一些时间