提问人:Meadow 提问时间:3/25/2021 更新时间:3/25/2021 访问量:729
Mybatis 混合预处理语句和 sql 注入
Mybatis mix prepared statement with sql injection
问:
我有一个查询,我希望 Mybatis 将其视为其中一部分的 sql 注入,也将其视为准备好的语句。我使用的是 Mybatis xml 文件而不是注解。这是我想做的......
我的 java 对象正在传递一个包含 processId 和开始和结束日期的参数映射。processId 是 WHERE 子句之前查询的“top”的一部分。开始日期和结束日期位于 WHERE 子句中。因此,我试图获得作为准备好的语句运行的好处,但直到运行时我才知道processId。我的sql看起来像下面这样,但不确定如何混合这两种构建sql的模式。有没有办法做到这一点?
SELECT ${processId}, x, y, z FROM AnotherTable t
WHERE t.startDate >= ? AND t.endDate <= ?```
答:
0赞
The Impaler
3/25/2021
#1
您不需要 SQL 注入(如 )。正常参数(如 中)将起作用。你没有提到具体的数据库,但据我所知,我尝试过所有JDBC驱动程序支持“选择列表”中的参数。${a}
#{a}
您可以执行以下操作:
<select id="mySelect">
select #{processId}, x, y, z
from AnotherTable t
where t.startDate >= #{startDate} AND t.endDate <= #{endDate}
</select>
并记住如上所示逃离你的。<
评论
0赞
Meadow
3/25/2021
谢谢穿刺者。看起来我可以将${processId}与#{startDate}和#{endDate}一起使用来混合“语句”和“准备好的语句”,并使其按预期工作。
0赞
The Impaler
3/25/2021
是的,你可以这样做,但除非绝对必要,否则避免 SQL 注入是一种很好的做法。下一个修改应用程序的开发人员可能不像您那么小心,并且可能会在应用程序中打开一个很大的安全漏洞。
0赞
Meadow
3/25/2021
#2
我找到了答案。我只需要在我的 Insert 标签中指定 parameterType 和 parameterMap 属性......
<parameterMap type="java.util.Map" id="myParameterMap">
<parameter property="startDate"/>
<parameter property="endDate"/>
</parameterMap>
<insert id="theSqlToRun" parameterType="java.util.Map" parameterMap="myParameterMap">
SELECT ${processId}, x, y, z FROM AnotherTable t
WHERE t.startDate >= ? AND t.endDate <= ?
</insert>
评论
0赞
The Impaler
3/25/2021
这是因为您决定不命名第二个和第三个参数,而是使用(位置参数)。我建议不要这样做(并将它们命名为 和),因为将来修改 SQL 语句时很容易犯错误。?
#{startDate}
#{endDate}
0赞
ave
3/26/2021
如文档中所述,已弃用。没有任何功能需要它。目前尚不清楚在 SQL 语句中是用作常量值还是列名。如果是常量值,@TheImpaler 的答案是正确的。如果是列名,则@TheImpaler的上述注释是正确的解决方案。<parameterMap />
processId
processId
评论