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 ...
随机推荐
- 为新装的Centos 7X更换源,升级VIM失败,待解决
CentOS 7X使用阿里云CentOS的yum源 1.备份原有repo文件 #cd /etc/yum.repos.d #mv /etc/yum.repos.d/CentOS-Base.repo /e ...
- 【新手可看懂】ubuntu配置appium环境
1.node安装: 在node官网:https://nodejs.org/en/download/ 下载对应的安装包(这里建议下载最新的版本)下载好后放在liunx指定路径下 我这里放到opt这个文件 ...
- Springboot默认定时任务——Scheduled注解
1.pom配置 <dependencies> <dependency> <groupId>org.springframework.boot</groupId& ...
- python接口自动化13-data和json参数傻傻分不清
前言 在发post请求的时候,有时候body部分要传data参数,有时候body部分又要传json参数,那么问题来了:到底什么时候该传json,什么时候该传data? 一.识别json参数 1.在前面 ...
- 用js刷剑指offer(把数组排成最小的数)
题目描述 输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个.例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323. 思路 对ve ...
- abp学习(一)
官网概念 ASP.NET样板是特别设计的新的现代Web应用程序的通用应用框架.它使用已经熟悉的工具并围绕这些工具实现最佳实践,从而为您提供一致的开发体验. 官网地址:https://aspnetboi ...
- Java判断对象类型是否为数组
判断对象是否为数组: public static void main(String[] args) { String[] a = ["1","2"]; if(a ...
- error: invalid-first-character-of-tag-name错误解决方案
HTML 特殊字符写法要用原始码,例如: ‘<’ 原始码为 < ‘>’ 原始码为 > 解决示例: 原错误代码 <div><</div> 修改后代码 ...
- 版本控制Git研究二
经过好几周的工作忙碌,终于可以有时间静下心来学习东西了,做为崇尚技术的人来说,应该是最幸福的时光了,呵呵,当然也是宅神的表现啦,话不多说,继续git的学习,上次已经对git的一些概念进行了说明,具体可 ...
- django知识点回顾
1.web应用 本质是基于socket实现的应用程序 浏览器-----------服务器 2.http协议:应用层协议 1.基于TCP协议 2.基于请求响应 3.短连接 4.无状态保存(引入了cook ...