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


相关推荐

  • tikv源码分析_crt脚本命令大全

    tikv源码分析_crt脚本命令大全版权声明:本文由神州数码云基地团队整理撰写,若转载请注明出处。以TiKvConfigstruct为起始点,从TiKvConfig内部的字段开始,分析每个模块的作用和配置检查逻辑所做的事情。TiKV是一个分布式事务型的键值数据库,是TiDB的存储层,提供了满足ACID约束的分布式事务接口,并且通过Raft协议保证了多副本数据一致性以及高可用。关于TiDB、TiKV的详细介绍可以从官网查阅,这里就不多赘述了。知乎上已经有一篇高屋建瓴的文章,由TiKV亲爹Ed写的TiKV代码初探,可以从整

    2022年9月23日
    0
  • 免费的UML工具

    免费的UML工具VisualParadigmCommunityEdition是自2004年以来推出的,旨在提供免费的UML软件,用于非商业目的,支持在UML建模方面迈出第一步的用户,以及需要免费的跨平台UML建模软件的用户个人使用,如在学生项目中使用UML。UML建模工具免费用于各种非商业目的。支持13个UML2.x图和ERD图。VisualParadigmCommFreeUMLToolforPersonalandnon-Commercialpurposes,downloadnow!

    2022年7月12日
    14
  • Linux 常用命令解析和Bash Shell使用示例脚本演示

    Linux 常用命令解析和Bash Shell使用示例脚本演示

    2022年1月13日
    144
  • RHCSA_rhce考试题库

    RHCSA_rhce考试题库1、SElinux必须运行在Enforcing模式下。1、SElinux必须运行在Enforcing模式下。2、配置YUM源,使用地址http://content.example.com/rhel

    2022年8月6日
    1
  • wifi reaver

    wifi reaverPIN码的格式很简单,八位十进制数,最后一位(第8位)为校验位(可根据前7位算出),验证时先检测前4位,如果一致则反馈一个信息,所以只需1万次就可完全扫描一遍前4位,前4位确定下来的话,只需再试1000次(接下来的3位),校验位可通过前7为算出,就可暴力验证出pin码。所以即时你不知道校验位怎么计算,那你最多尝试10000+1000+10次=11010次就可以获得PIN,从而获得wifi…

    2022年6月4日
    45
  • JavaScript定时器与清除定时器

    JavaScript定时器与清除定时器定时器 清除定时器

    2025年7月20日
    0

发表回复

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

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