0

这是我的应用程序查询模块中的一个关键字冲突问题,请看看您是否可以告诉我一个聪明的解决方案。

首先,在查询模块中,每个查询条件在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注入问题。

4

3 回答 3

2

在将任何信息发送到数据库之前,代码应该开始尝试在服务器端停止 SQL 注入。我不确定您使用的是什么语言,但这通常是通过创建一个包含某种绑定变量的语句来完成的。在 Java 中,这是一个PreparedStatement,其他语言包含类似的功能。

在语句中使用绑定变量或参数将利用内置的 SQL 注入保护,老实说,这将比您或我在数据库上编写的任何内容都要好。如果您String在服务器端进行任何连接以形成完整的 SQL 语句,则表明存在 SQL 注入风险。

于 2013-07-08T08:36:05.883 回答
1
0   An ASCII NUL (0x00) character.
'   A single quote (“'”) character.
"   A double quote (“"”) character.
b   A backspace character.
n   A newline (linefeed) character.
r   A carriage return character.
t   A tab character.
Z   ASCII 26 (Control+Z). See note following the table.
\   A backslash (“\”) character.
%   A “%” character. See note following the table.
_   A “_” character. See note following the table

参考

堆叠类似问题

于 2013-07-08T08:36:19.153 回答
0

您应该在 SQL 语句中使用绑定变量。如前所述,这是使用 Java 中的 PreparedStatements 完成的。

为确保仅使用有效的列名,您可以针对数据库验证输入。MySQL 提供模式信息,例如每个表的列作为 INFORMATION_SCHEMA 的一部分。有关更多信息,请查看 MySQL 文档:

“INFORMATION_SCHEMA 列表”

于 2013-07-08T08:44:07.110 回答