ibatis动态传入表名造成的SQL注入的解决方案(摘录的)

ibatis动态传入表名造成的SQL注入的解决方案(摘录的)

如何解决动态数据表名,动态字段名情况下,由

ibatis

缓存

select

字段而引起的

 

字段找不到的情况?以下是最简单的解决办法!

 

当使用动态表,动态字段时,会引起字段名的缓存,以下是解决办法。

 

先看一个例子。下面是段

SQL

语句

 

<!– 

根据查询条件从类推数据表中查询数据

 

–> 

 

<select 

id=”select_resData_bycondition” 

parameterClass=”java.util.HashMap” 

 

 

 

 

resultClass=”java.util.HashMap” remapResults=”true” > 

 

 

select $fieldnames$ from $resourcetable$ where 1=1 

 

 

<include refid=”select_data_by_condition” /> 

 

</select> 

 

前台传入的

hashmap

变量中,有动态数据表名,及字段名,

 

Dao

里面的调用方法如下:

 

//

根据动态数据表名及动态选择的字段按条件分页查出相应的数据

,

注意清除缓存的使

 

 

public void getResDataByCondition(Page page) { 

 

 

// TODO Auto-generated method stub 

 

 

 

 

 

 

 

super

.queryForListPagination(“select_resData_bycondition”, 

page); 

 

 

 

 

 

 

 

 

父类的

queryForListPagination

如下:其中

page

这个变量是对

dataset

进行一些

封装,对查询条件封装。

 

 

public 

void 

 

queryForListPagination(String 

statementName,Page 

page){ 

 

 

 

 

 

.

 

 

 

 

 

 

 

 

 

 

 

由于多个菜单会调用到这个

dao

中的

getResDataByCondition

方法,也就去调用

 

Id

select_resData_bycondition

select

语句,由于

ibatis

的缓存机制,

 

当第一次调用这个

select

语句时,会将字段查询出来,放入缓存中,比如第一个表

 

user

人员表,有字段

gh,name,gz

等字段,则第二次调用时,前台传入了表名是

 

Dwbm

部门表,有字段

bmbm,bmmc

等,看了

ibatis

的源码,知道

 

ibaits

中缓存列名的地方在这里:

 

 

 

com.ibatis.sqlmap.engine.mapping.result .AutoResultMap 

 

 

 

public 

synchronized 

Object[] 

getResults(StatementScope 

statementScope, ResultSet rs) 

 

 

 

 

 

 

 

throws SQLException { 

 

 

 

 

if (allowRemapping || getResultMappings() == null) { 

 

 

 

 

 

 

initialize(rs); 

 

 

 

 

 

 

 

 

return super

.getResults(statementScope, rs); 

 

 

所以第二次形成的正确

SQL

语句应该是

select bmbm,bmmc from 

 

Dwbm where 

条件

 

如果这样,当然能找到适合的数据,不过由于以上所述缓存机制的存在,使得

 

在执行第二个动态查询时,实际上先将上一次查询出来的字段名放在缓存中,

 

gh,name,gz 

 

这时取出来,形成了实际的

SQL

语句

 

Select gh,name,gz from dwbm where 

条件

 

这样当然就不正确了!

 

最简单的解决办法是在各

SQL

语句的书写中,加上

remapResults=”true” 

如上面的

id

“select_resData_bycondition”

的语句,

 

这样就强制每次根据前台传进的动态数据表名,和动态字段名,

 

重新去映射字段,而不再使用上一次的字段列表,这样当然就正确了!

 

再不会出现某字段找不到的情况!这是最简单的办法!

转载于:https://www.cnblogs.com/liyang31tg/p/3435482.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/109972.html原文链接:https://javaforall.net

(0)
上一篇 2021年8月26日 下午8:00
下一篇 2021年8月26日 下午9:00


相关推荐

  • vue页面缓存问题_vue项目自动打开浏览器设置

    vue页面缓存问题_vue项目自动打开浏览器设置目录1.什么是浏览器缓存2.浏览器缓存类型:3.浏览器缓存的优势与劣势:4.浏览器缓存机制5.如何清除浏览器缓存在代码更新发布后,都会要求运营人员在访问网址时清除下本地缓存,防止万一掉坑那问题就来了:每次清缓存很麻烦,怎样就不需要他们每次去手动清缓存呢?1.什么是浏览器缓存浏览器缓存(BrowserCaching)是为了节约网络的资源加速浏览,浏览器在用户磁盘上对最近请求过的文档进行存储,当访问者再次请求这个页面时,浏览器就可以从本地磁盘显示文档,这样就可以加速页

    2022年10月20日
    3
  • 腾讯终于折叠:元宝明修栈道,微信暗渡陈仓

    腾讯终于折叠:元宝明修栈道,微信暗渡陈仓

    2026年3月12日
    3
  • 电脑磁盘未知没有初始化_win7怎么进去计算机管理

    电脑磁盘未知没有初始化_win7怎么进去计算机管理win7系统想必大家都非常熟悉吧,然而有时候可能会碰到win7系统电脑新增的硬盘没有初始化的情况,想必大家都遇到过win7系统电脑新增的硬盘没有初始化的情况吧,那么应该怎么处理win7系统电脑新增的硬盘没有初始化呢?我们依照  1、当正常增加新硬盘后,登录系统,打开磁盘管理,系统会自动打开【磁盘初始化和转换向导】,单击“下一步”; 2、正确选择要初始化的磁盘,单击“下一步”;这样的步骤就行了;下…

    2026年2月10日
    5
  • 自制STC12C5A60S2最小系统板

    自制STC12C5A60S2最小系统板一个单片机芯片没有烧录用户程序 它是不会工作的 但是 一个烧录了用户程序的单片机芯片 给它上电也不会工作 因为单片机能够工作的最小电路还包括时钟和复位电路 通常称之为单片机最小系统 时钟电路为单片机工作提供基本时钟 复位电路用于将单片机内部各电路状态恢复到初始值 STC12C5A60S2 系列单片机是宏晶科技生产的单时钟 机器周期 1T 的单片机 它是高速 低功耗 超强抗干扰的新一代 8051 单片机 指令代码完全兼容传统 8051 但速度快 8 12 倍 内部集成 MAX810 专用复位电路 2 路 PWM

    2026年3月26日
    2
  • SQLSERVER存储过程语法的具体解释

    SQLSERVER存储过程语法的具体解释

    2022年1月11日
    32
  • javascript超强幻灯片代码

    javascript超强幻灯片代码javascript超强幻灯片代码[code]#f_div{    width:150px;    height:100px;    overflow:hidden;    margin-top:0;    margin-right:auto;    margin-bottom:0;    margin-left:0px;}#f_

    2022年7月13日
    20

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号