Ibatis自动解决sql注入机制
疑问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注入机制的更多相关文章
- (转载)ibatis:解决sql注入问题
原文地址:http://blog.csdn.net/scorpio3k/article/details/7610973 对于ibaits参数引用可以使用#和$两种写法,其中#写法会采用预编译方式,将转 ...
- IBatis.Net使用总结(一)-- IBatis解决SQL注入(#与$的区别)
IBatis解决SQL注入(#与$的区别) 在IBatis中,我们使用SqlMap进行Sql查询时,需要引用参数,在参数引用中可以使用两种占位符#和$.这两种占位符有什么区别呢? (1):#***#, ...
- 解决 SQL 注入的另类方法
本文是翻译,版权归原作者所有 原文地址(original source):https://bitcoinrevolt.wordpress.com/2016/03/08/solving-the-prob ...
- PreparedStatement解决sql注入问题
总结 PreparedStatement解决sql注入问题 :sql中使用?做占位符 2.得到PreparedStatement对象 PreparedStatement pst=conn.prepar ...
- 使用过滤器解决SQL注入和跨站点脚本编制
1 SQL注入.盲注 1.1 SQL注入.盲注概述 Web 应用程序通常在后端使用数据库,以与企业数据仓库交互.查询数据库事实上的标准语言是 SQL(各大数据库供应商都有自己的不同版本).Web 应用 ...
- MyBatis是如何解决Sql注入的
转:[转]mybatis如何防止sql注入 java中预处理PrepareStatement为什么能起到防止SQL注入的作用??!! 一.SQL注入 sql注入大家都不陌生,是一种常见的攻击方式,攻击 ...
- MySQL_(Java)使用preparestatement解决SQL注入的问题
MySQL_(Java)使用JDBC向数据库发起查询请求 传送门 MySQL_(Java)使用JDBC创建用户名和密码校验查询方法 传送门 MySQL数据库中的数据,数据库名garysql,表名gar ...
- JDBC_08_解决SQL注入问题 (登录和注册)
解决SQL注入问题 只要用户提供的信息不参与sql语句的编译过程,那么尽管用户输入的信息中含有sql关键字那么也不会起作用了 要想使用户提供信息不参与sql语句的编译过程,那么必须使用 java.sq ...
- jdbc 07: 解决sql注入
jdbc连接mysql,解决sql注入问题 package com.examples.jdbc.o7_解决sql注入; import java.sql.*; import java.util.Hash ...
随机推荐
- HTTP协议复习三--TCP/IP的网络分层模型和OSI 网络分层模型
TCP/IP网络分层模型 第一层叫“链接层”(link layer),负责在以太网.WiFi这样的底层网络上发送原始数据包,工 作在网卡这个层次,使用MAC地址来标记网络上的设备,所以有时候也叫MAC ...
- zabbix-web切换为nginx及https
目录 zabbix-web切换为nginx及https 1.背景和环境 2.安装nginx 2.1.编译参数 2.2.修改配置文件并配置https 2.3.配置nginx为系统服务 3.安装php 3 ...
- cal of easter egg
在Linux中用cal命令查看1752年9月,发现3到13日全都消失了……
- 2013.4.26 - KDD第八天
下午上Android课,我看中秋也选这个课了,然后在上半节的时候速补了一下秦海龙师兄的那篇文章.中间休息的时候窜到了中秋那里,然后讨论了半节课现在的情况. 现在的情况是这样的: 中 秋开始是没有进行主 ...
- python高级特性-列表生成
概述 [x *x for x in range(1,11)][k+'='+v for k,v in d.items()] [s.lower() for s in L] 详解 1.单层迭代 >&g ...
- LeetCode - 206、反转链表
反转一个单链表. 示例: 输入: 1->2->3->4->5->NULL 输出: 5->4->3->2->1->NULL /** * 列表定 ...
- 基于Java+Selenium的WebUI自动化测试框架(十三)-----基础页面类BasePage(Excel)
前面,我们讲了如何使用POI进行Excel的“按需读取”.根据前面我们写的BasePageX,我们可以很轻松的写出来基于这个“按需读取”的BasePage. package webui.xUtils; ...
- linux网络编程之socket编程(四)
经过两周的等待,终于可以回归我正常的学习之旅了,表哥来北京了在我这暂住,晚上回家了基本在和他聊天,周末带他在北京城到处乱转,几乎剥夺了我自由学习的时间了,不过,亲人之情还是很难得的,工作学习并不是生活 ...
- Mongodb设置用户权限(整理版)
本文是基于windows 下 MongoDB 4.0编写,据了解MongoDB在3.0以后的版本中权限设置有变化. 1. 创建超级用户 安装完之后,打开命令行,进入mongodb安装目录,在bin目录 ...
- GITHUB添加SSH内容
首先,你需要注册一个 github账号,最好取一个有意义的名字,比如姓名全拼,昵称全拼,如果被占用,可以加上有意义的数字. 本文中假设用户名为 chuaaqiCSDN(我的博客名的全拼) 一.gihu ...