这是我的应用程序查询模块中的一个关键字冲突问题,请看看您是否可以告诉我一个聪明的解决方案。
首先,在查询模块中,每个查询条件在UI中包含三个部分:
1.字段名称,其值是固定的,例如origin,finalDest...
2.operator,它是一个选择列表,包括“喜欢”、“不喜欢”、“在”、“不在”、“=”、“!=”
3.value,这部分由用户输入。然后在后端,它会根据UI的查询条件组装SQL语句,例如如果用户在UI中输入/选择以下内容
Field Name Operator Value
origin like CHI
finalDest in SEL
在后端,它将生成以下 SQL:
select * from Booking where origin like '%CHI%' and finalDest in ('SEL')。
但是有一个bug,例如如果用户在“value”中输入一些特殊符号,例如“'”,“_”等,会导致生成的SQL也包含'或_,例如:
select * from Booking where origin like '%C_HI%' and finalDest in ('S'EL')。
你可以看到“where”块中有特殊符号,SQL不能被执行
对于这个问题,我的解决方案是在执行之前在特殊符号前面添加转义字符“/”,但我知道的只是'或_会与SQL关键字冲突,你知道是否还有其他类似的符号我需要处理或者你们有什么更好的主意可以避免注射
对不起,忘了告诉你我用的是什么语言,我用的是java,数据库是mysql,我也用hibernate,很多人说我为什么不用PreparedStatement,这有点复杂,简单来说,在我的公司,我们有一个叫做动态查询的固件,我们在一个 XML 文件中预先定义了 SQL 片段,然后我们将根据 UI 传入标准和 jxel 表达式组装 SQL,因为 SQL 有点预先定义的东西,我怕如果改用PreparedStatement,对我们的FW会有很大的改动,所以我们关心的只是如何用简单的方法解决SQL注入问题。