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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Android Intent 解析之二

    Android Intent 解析之二

    2021年12月5日
    51
  • c语言数组中插入新数据

    c语言数组中插入新数据数组插入数据 在数组的应用中,我们有时会向数组中插入一个数据,而且不打破原来的排序规律,其实数组中的插入数据,就是数据的比较和移动;如果想要弄懂这些方法最好拿笔比划以下,或者debug一下,了解其中的思想,光看理解的不深;方法一:输入一个数据x,将数组中的数据与x逐一比较,如果大于x,记录下数据的下标,然后此数据下标和其后的数据的下标都加一,相当于都向后挪一位,然后将x赋值给数组的那…

    2022年7月11日
    17
  • JavaScript字符串截取

    JavaScript字符串截取一、常用方法说明1.substr2.substring3.slice二、举例说明1.substr2.substring3.slice

    2022年6月13日
    27
  • oracle 拼接字符_oracle怎么拼接字符串

    oracle 拼接字符_oracle怎么拼接字符串原来oracle拼接字符串就是||原来oracle拼接字符串就是||原来oracle拼接字符串就是||

    2022年9月20日
    2
  • PHP中put和post区别

    PHP中put和post区别

    2021年10月12日
    47
  • 线程通信(ITC)

    线程通信(ITC)为什么要通信通信是人的基本需求。而进程作为人的发明,自然脱离不了人的习性,也有通信需求。如果进程之间不进行任何通信,那么进程所能完成的任务就要大打折扣。例如,父进程在创建子进程后,通常须要监督子进程的状态,以便在子进程没有完成给定的任务时,可以再创建一个子进程来继续。这就需要父子进程间通信。而线程间的通信则需要更多。由于一个进程通常包括多个线程,这多个线程之间因资源共享自然地就存在一种合作关系。这种合作关系虽然可以表现为相互独立,但更多地时候是互相交互。这就是通信。就像舞台上的多个演员,他们之间是一种

    2022年6月19日
    53

发表回复

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

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