之前在ibatis直接执行已有sql语句中记录了如何直接执行sql语句。
想要执行这样一个语句,根据用户输入的条件,查询分数大于(小于、等于、大于等于、小于等于)某分数的应用的信息,但是查询的条件(大于、小于等)也是需要用户传进来的符号,所以代码这样写:
<select id="selectAppNames" parameterClass="java.util.Map" resultClass="measureResultDO">
select * from apaas_measure_result WHERE 1 = 1
<dynamic>
<isNotNull property="nodeId" prepend="and">
node_id=#nodeId#
</isNotNull>
<isNotNull property="symbol" prepend="and">
<isNotNull property="numeric">
score $symbol$ #numeric#
</isNotNull>
</isNotNull>
</dynamic>
</select>
但是在ibatis的SQLMAP文件中使用$value$引入变量存在SQLInjection漏洞。
所以,将代码改成如下:
<select id="selectAppNames" parameterClass="java.util.Map" resultClass="measureResultDO">
select * from apaas_measure_result WHERE 1 = 1
<dynamic>
<isNotNull property="nodeId" prepend="and">
node_id=#nodeId#
</isNotNull>
<isNotNull property="symbol" prepend="and">
<isNotNull property="numeric">
score $symbol:SQLKEYWORD$ #numeric#
</isNotNull>
</isNotNull>
</dynamic>
</select>
基本规则
用户使用的sql代码中能用#name#代替$name$的尽量用#name#替换.sql代码中不应当出现$符合的变量.($引入的变量会导致sql注入的风险)
以下说明order by和sort 需要输入动态参数时的处理方式
order by e.g.
select TABLE_NAME,TABLESPACE_NAME from user_tables order by $orderByColumn$ .
其中orderByColumn是数据库中的字段. 对这种元数据的请使用:$orderByColumn:METADATA$替换$orderByColumn$.
sort e.g.
select TABLE_NAME,TABLESPACE_NAME from user_tables order by TABLE_NAME $ordertype$
其中ordertype为用户输入的ASC,DESC.对这种关键字请使用 $ordertype:SQLKEYWORD$替换 $ordertype$ .