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.这里只记录一些日记(只为提升英语,暂时有点忙,等转行了开始写)
  • 相关阅读:
    Elasticsearch URI search 查询语法整理
    在linux下执行git clone、git pull 、git push等操作免密
    Gitlab 安装、升级、备份、恢复、汉化等
    python 使用xlsxwriter 写入数据时,当数据中链接的后面包含空格时(如:"http://*** "),导出问题打开报错
    offsetLeft && left
    DOM事件绑定方式
    获取不到offsetHeight问题
    jquery 图片预加载
    模仿JQuery 的添加多个事件的原理
    当节点结构变化的时候要重新获取 不然之前的变量还是以前的节点结构
  • 原文地址:https://www.cnblogs.com/liyang31tg/p/3435482.html
Copyright © 2011-2022 走看看