问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

当使用mybatis时怎么防止sql注入

发布网友 发布时间:2022-04-27 04:20

我来回答

2个回答

懂视网 时间:2022-04-08 12:16

mybatis框架作为一款半自动化的持久层框架,其sql语句都要我们自己来手动编写,这个时候当然需要防止sql注入。其实Mybatis的sql是一个具有“输入+输出”功能,类似于函数的结构,如下:

<select id=“getBlogById“ resultType=“Blog“ parameterType=”int”>
select id,title,author,content from blog where id=#{id} </select>

这里,parameterType标示了输入的参数类型,resultType标示了输出的参数类型。回应上文,如果我们想防止sql注入,理所当然地要在输入参数上下功夫。上面代码中高亮部分即输入参数在sql中拼接的部分,传入参数后,打印出执行的sql语句,会看到sql是这样的:

select id,title,author,content from blog where id = ?

不管输入什么参数,打印出的sql都是这样的。这是因为mybatis启用了预编译功能,在sql执行前,会先将上面的sql发送给数据库进行编译,执行时,直接使用编译好的sql,替换占位符“?”就可以了。因为sql注入只能对编译过程起作用,所以这样的方式就很好地避免了sql注入的问题。

mybatis是如何做到sql预编译的呢?其实在框架底层,是jdbc中的PreparedStatement类在起作用,PreparedStatement是我们很熟悉的Statement的子类,它的对象包含了编译好的sql语句。这种“准备好”的方式不仅能提高安全性,而且在多次执行一个sql时,能够提高效率,原因是sql已编译好,再次执行时无需再编译。

话说回来,是否我们使用mybatis就一定可以防止sql注入呢?当然不是,请看下面的代码: 

<select id=“orderBlog“ resultType=“Blog“ parameterType=”map”>

 select id,title,author,content from blog order by ${orderParam}

</select>

仔细观察,内联参数的格式由“#{xxx}”变为了${xxx}。如果我们给参数“orderParam”赋值为”id”,将sql打印出来,是这样的:

select id,title,author,content from blog order by id

显然,这样是无法阻止sql注入的。在mybatis中,”${xxx}”这样格式的参数会直接参与sql编译,从而不能避免注入攻击。但涉及到动态表名和列名时,只能使用“${xxx}”这样的参数格式,所以,这样的参数需要我们在代码中手工进行处理来防止注入。

结论:在编写mybatis的映射语句时,尽量采用“#{xxx}”这样的格式。若不得不使用“${xxx}”这样的参数,要手工地做好过滤工作,来防止sql注入攻击。

【转】mybatis如何防止sql注入

标签:

热心网友 时间:2022-04-08 09:24

MyBatis框架作为一款半自动化的持久层框架,其SQL语句都要我们自己手动编写,这个时候当然需要防止SQL注入。其实,MyBatis的SQL是一个具有“输入+输出”的功能,类似于函数的结构,如下:
<select id="getBlogById" resultType="Blog" parameterType=”int”>
SELECT id,title,author,content
FROM blog
WHERE id=#{id}
</select>
这里,parameterType表示了输入的参数类型,resultType表示了输出的参数类型。回应上文,如果我们想防止SQL注入,理所当然地要在输入参数上下功夫。上面代码中*高亮即输入参数在SQL中拼接的部分,传入参数后,打印出执行的SQL语句,会看到SQL是这样的:
SELECT id,title,author,content FROM blog WHERE id = ?
不管输入什么参数,打印出的SQL都是这样的。这是因为MyBatis启用了预编译功能,在SQL执行前,会先将上面的SQL发送给数据库进行编译;执行时,直接使用编译好的SQL,替换占位符“?”就可以了。因为SQL注入只能对编译过程起作用,所以这样的方式就很好地避免了SQL注入的问题。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
五月天的历年专辑价钱及曲目 五月天的所有专辑? 五月天一共有多少专辑啊? 请问男女之间的爱情有性才能维持吗? 迈克尔 杰克逊的最好听的十首歌 给个下载地址 分公司是否可以和员工签订劳动合同 分公司能否与员工签立劳动合同? 分公司可以与员工签订劳动合同的吗 分公司可否签订劳动合同 分公司能否签劳动合同 隆林县腊仁村,赶集天人多不 隆林建成农业投资开发有限公司怎么样? 隆林岩茶乡生态扶贫移民*移民了家里的的田地还得吗?我们乡是谁负责这方面 广西省百色市隆林县岩茶乡财政所电话号广西省百色市隆林县岩茶乡财政所电话号码? 经济业态 隆林各族自治县的行政区划 隆林县岩茶乡平班长这屯 广西百色市隆林县各个乡镇有多少人口? 隆林县腊仁村,赶集天人多不的 百色市隆林县岩茶乡乡府距离河池市罗城县县府有多远 百色市隆林县岩茶乡距离河池市罗城县有多远 广西百色市隆林县岩茶乡的生态原林有那些片区不能砍树 三星手机屏幕自动关闭怎么不管 三星手机怎样关闭屏幕 三星手机锁屏后不会解,关机都关不了 三星手机怎么关闭屏幕 三星手机不能自动关屏 三星手机关不了屏幕 三星手机关闭不了亮屏 三星s8屏幕为什么关不了? mybatis中的#和$的区别 以及 防止sql注入 在mybatis的sql配置文件中怎样使用like并防止sql注入攻击 mybatis中的$的sql注入该怎么解决 请问不小心把花呗的临时额度用完没有按照规定时间还进去会不会对征信? 花呗的临时额度如果过期了我还没还完会怎么样? mybatis sql怎么注入 我因有事刷了临时额度,现在是在是还不起,该怎么办 芋头饺子皮的做法比例 芋头水饺皮怎么做好吃 芋饺皮怎么做不会裂? 香芋饺子馅怎么做好吃窍门 香芋馅饺子的做法步骤图,香芋馅饺子怎么做 Win10系统如何操作蓝牙实现文件传输? Word实用操作技巧(4):表格处理 Word中表格的调整及处理 工商银行公司帐户能转入个人帐户款吗 工商银行公司对个人转账多久到账? 工商银行对公账户可以转私人账户吗 工商银行公账转工商银行私账会收手续费吗 下载了大白菜软件想重装系统,然后怎么用呢?