zoukankan      html  css  js  c++  java
  • 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"

    的语句,

     

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

     

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

     

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

    1.这里只记录一些学习笔记 2.这里只记录一些学习心得,如果心得方向有错,请留言 2.这里只记录一些日记(只为提升英语,暂时有点忙,等转行了开始写)
  • 相关阅读:
    docker 部署aps.net MVC到windows容器
    docker 搭建私有仓库 harbor
    解决关于:Oracle数据库 插入数据中文乱码 显示问号???
    ionic cordova build android error: commamd failed with exit code eacces
    cordova build android Command failed with exit code EACCES
    Xcode 10 iOS12 "A valid provisioning profile for this executable was not found
    使用remix发布部署 发币 智能合约
    区块链: 编译发布智能合约
    mac 下常用命令备忘录
    JQuery fullCalendar 时间差 排序获取距当前最近的时间。
  • 原文地址:https://www.cnblogs.com/liyang31tg/p/3435482.html
Copyright © 2011-2022 走看看