SQL注入的智能解决方案

时间:2013-07-08 08:31:53

标签: mysql sql database

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

首先,在查询模块中,每个查询条件在UI中包含三个部分:

1.字段名称,其值是固定的,例如origin,finalDest ...

2.operator,这是一个选择列表,包括“喜欢”,“不喜欢”,“在”,“不在”,“=”,“!=”

3.value,这部分由user.then在后端输入,它将根据UI的查询条件组装SQL语句,例如,如果用户在UI中键入/选择以下内容

Field Name       Operator       Value
origin           like           CHI
finalDest        in             SEL

在后端,它将生成以下SQL:

从预订中选择*,其中原点如'%CHI%'和finalDest in('SEL')。

但是有一个错误,例如,如果用户在“值”中键入一些特殊符号,例如“'”,“_”等,它将导致生成的SQL也包含'或_,例如:

从预订中选择*,其中原点如'%C_HI%'和finalDest in('S'EL')。

你可以看到“where”块中有特殊符号,SQL无法执行

对于这个问题,我的解决方案是在执行之前在特殊符号前添加转义字符“/”,但我所知道的只是'或_会与SQL关键字冲突,你知道是否有任何其他类似的符号,我需要处理或你们有任何更好的想法,可以避免注射

很抱歉,忘了告诉你我用的是什么语言,我用java,DB是mysql,我也用hibernate,有很多人说为什么我没用PreparedStatement,这有点复杂,简单来说,在我的公司,我们有一个名为动态查询的FW,我们在XML文件中预先定义了SQL片段,然后我们将根据带有jxel表达式的标准的UI传递来组装SQL,因为SQL是有点的预先定义的东西,我担心如果改为使用PreparedStatement,它将涉及我们的FW的很多变化,所以我们关心的只是如何以一种简单的方式修复SQL注入问题。

3 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分: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

<强> Reference

<强> Stack Similar Question

答案 2 :(得分:0)

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

为确保只使用有效的列名,您可以根据数据库验证输入。 MySQL提供架构信息,如每个表的列,作为INFORMATION_SCHEMA的一部分。有关详细信息,请查看MySQL文档:

"The INFORMATION_SCHEMA COLUMNS Table"