下面这段代码可能使用不可信赖的数据源输入构建 SQL 查询。通过这种调用,攻击者能够修改语句的含义或执行任意 SQL 命令。要如何修改这段代码避免问题产生: <select id="listPageCustom" resultType="com.midea.cloud.srm.model.base.material.MaterialItem"> SELECT MR.* FROM scc_base_material_item MR WHERE MR.MATERIAL_ID IN ( SELECT MI.MATERIAL_ID FROM scc_base_material_item MI LEFT JOIN ceea_base_material_org MO ON MO.MATERIAL_ID = MI.MATERIAL_ID ${ew.customSqlSegment} ) </select>
时间: 2023-05-16 09:07:29 浏览: 163
基于ASP+SQL公交查询系统(论文+源代码).rar
可以使用参数化查询来避免 SQL 注入攻击。具体来说,可以将输入的数据作为参数传递给 SQL 查询,而不是直接将其拼接到 SQL 语句中。例如,可以使用 MyBatis 的 #{paramName} 语法来引用参数。修改后的代码如下:
<select id="listPageCustom" resultType="com.midea.cloud.srm.model.base.material.MaterialItem">
SELECT MR.*
FROM
scc_base_material_item MR
WHERE MR.MATERIAL_ID IN (
SELECT MI.MATERIAL_ID
FROM
scc_base_material_item MI
LEFT JOIN ceea_base_material_org MO ON MO.MATERIAL_ID = MI.MATERIAL_ID
${ew.customSqlSegment}
AND MI.MATERIAL_ID = #{materialId}
)
</select>
在这个例子中,我们添加了一个名为 materialId 的参数,并使用 #{materialId} 引用它。这样,无论 materialId 的值是什么,它都不会对 SQL 查询产生影响,因为它不会被拼接到 SQL 语句中。
阅读全文