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


相关推荐

  • python autopep8_汽车auto出现错误8怎么解决

    python autopep8_汽车auto出现错误8怎么解决PEP8PEP8–StyleGuideforPythonCodePEPmeansPythonEnhancementProposals.可以理解为Python相关的规范性建议文档,深入学习Python必读。autopep8(github)AtoolthatautomaticallyformatsPythoncodetoconformtothePEP8styleguide.autopep8–in-place–aggressive–a..

    2025年11月4日
    2
  • CSS自定义鼠标样式[通俗易懂]

    CSS自定义鼠标样式[通俗易懂]效果图原理cursor属性:cursor属性规定要显示的光标的类型(形状)。该属性定义了鼠标指针放在一个元素边界范围内时所用的光标形状。使用url,可自定义鼠标图标。cursor:url(‘https://blog-static.cnblogs.com/files/lucas–liu/cat6.ico’),default;自定义图标注意点尺寸最好选择不大于于32*32像素的Opera9.3和Safari3不支持url值图片最好用绝对路径浏览器兼容性不一

    2022年5月31日
    46
  • android代码签名和混乱的包装

    android代码签名和混乱的包装

    2022年1月7日
    57
  • require和import区别

    require和import区别区别 1 模块加载的时间 require 运行时加载 import 编译时加载 效率更高 区别 2 模块的本质 require 模块就是对象 输入时必须查找对象属性 import ES6 模块不是对象 而是通过 export 命令显式指定输出的代码 再通过 import 命令输入 这也导致了没法引用 ES6 模块本身 因为它不是对象 CommonJS 模块 let exists read

    2025年6月10日
    1
  • android 分区丢失,分区数据恢复

    android 分区丢失,分区数据恢复作者:SelenaKomez5月23,2018上更新总结:硬盘分区被删除或丢失?如何取回已删除或丢失的分区?数据恢复软件将帮助您恢复数据,即使在Windows或Mac计算机上删除或丢失分区。执行分区数据恢复不需要任何技术技能。硬盘分为一个或多个逻辑分区,以便更好地进行资源管理,并根据用户要求将数据分布在不同的位置。这些逻辑分区称为分区,并给出了某些独立硬盘协调工作的错觉。但是,计算机分…

    2022年8月11日
    27
  • CString 使用详解

    CString 使用详解CString::MakeUppervoidMakeUpper();Remarks备注ConvertsthisCStringobjecttoanuppercasestring.将原对

    2022年7月3日
    20

发表回复

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

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