欢迎访问昆山宝鼎软件有限公司网站! 设为首页 | 网站地图 | XML | RSS订阅 | 宝鼎邮箱 | 宝鼎售后问题提交 | 后台管理


新闻资讯

MENU

软件开发知识

在进行参数 图纸加密 化的时候

点击: 次  来源:宝鼎软件 时间:2017-07-27

原文出处: 岑凯伦(微信公号 - 凯伦说,ID:KailunTalk)

媒介

在JDBC中,主要利用的是两种语句,一种是支持参数化和预编译的PrepareStatement,可以或许支持原生的Sql,也支持配置占位符的方法,参数化输入的参数,防备Sql注入,一种是支持原生Sql的Statement,有Sql注入的风险。

在利用Mybatis举办开拓进程中,埋没了底层详细利用哪一种语句的细节,我们通过利用#和$汇报Mybatis,我们实际长举办的是怎么样的操纵,需要对语句举办参数化照旧说直接保持原生状态就好。

本日我们主要看一下利用两种标记利用时系统应对Sql注入的表示和Mybatis在内部是如何对他们处理惩罚的源码阐明。

#和$在应对Sql注入上的区别表示

操作现有应用措施,将(恶意的)SQL呼吁注入到靠山数据库引擎执行的本领,它可以通过在Web表单中输入(恶意)SQL语句获得一个存在安详裂痕的网站上的数据库,而不是凭据设计者意图去执行SQL语句。

好比说按照学生姓名查学生信息,会传入一个name的参数,假设学生姓名是方方,那么Sql就是

SELECT id,name,age FROM student WHERE name = '方方';

在没有做防Sql注入的时候,我们的Sql语句大概是这么写的

<select id="fetchStudentByName" parameterType="String" resultType="entity.StudentEntity"> SELECT id,name,age FROM student WHERE name = '${value}' </select>

正常环境下查出姓名切合方方的学生信息。

在举办参数 图纸加密 化的时候

但假如我们对传入的姓名参数做一些变动,软件开发,好比改成anything’ OR ‘x’='x,那么拼接而成的Sql就酿成了

SELECT id,name,age FROM student WHERE name = 'anything' OR 'x'='x'

在举办参数 图纸加密 化的时候

库内里所有的学生信息都被拉了出来,软件开发,是不是很可骇。原因就是传入的anything’ OR ‘x’='x和原有的单引号,正好构成了 ‘anything’ OR ‘x’='x’,而OR后头恒便是1,所以便是对这个库执行了查所有的操纵。

防御Sql注入的话,就是要把整个anything’ OR ‘x’='x中的单引号作为参数的一部门,而不是和Sql中的单引号举办拼接

利用了#即可在Mybatis中对参数举办转义

<select id="fetchStudentByName" parameterType="String" resultType="entity.StudentEntity"> SELECT id,name,age FROM student WHERE name = #{name} </select>

我们看一下发送到数据库端的Sql语句长什么样子。

SELECT id,name,age FROM student WHERE name = 'anything\' OR \'x\'=\'x'

从上述代码中我们可以看到参数中的所有单引号统统被转移了,这都是JDBC中PrepareStatement的功勋,假如在数据库处事端开启了预编译,则是处事端来做了这件工作。

详细可以看我之前写的这篇: JDBC与Mysql的那些事,内里表明白为何PrepareStatement能做到这件工作。

源码

在以前的文章中,我们说明过Mybatis的执行流程主要部件,SqlSession 提供应用户操纵的Api,Executor 详细执行对数据库的操纵,但其实在Executor内部还会再委托给StatementHandler这个接口。

在举办参数 图纸加密 化的时候

这个Handler的实现类就是代表了JDBC中的操纵语句,CallableStatementHandler、PrepareStatementHandler和SimpleStatementHandler就会代表对JDBC中的CallableStatement,PrepareStatement和Statement,这些handler的内部就会挪用JDBC中的相关Statement。

在举办参数 图纸加密 化的时候

类比Mybatis的执行流程和JDBC原有的我们利用的要领就是。

Mybatis: Sqlsession -> Executor -> StatementHandler -> ResultHandler

JDBC: Connection -> Statement -> Result

因此我们可以知道对JDBC语句的操纵城市在StatementHandler内部。

在PrepareStatementHandler中会利用paramterize对Statement举办参数化,在个中他会委托给DefualtParameterHandler举办操纵。我们通过两种差异的语句,看一下,Debug下这段代码的差异。

在举办参数 图纸加密 化的时候