Mysql SQL注入的智能解决方案

Mysql SQL注入的智能解决方案,mysql,sql,database,Mysql,Sql,Database,这是我的应用程序查询模块中的一个关键字冲突问题,请查看是否可以告诉我一个智能解决方案 首先,在查询模块中,每个查询条件在界面中包含三个部分: 1.字段名,其值是固定的,例如原点、最终测试 2.运算符,它是一个选择列表,包括“喜欢”、“不喜欢”、“在”、“不在”、“在”、“=”、“!=” 3.值,这部分由用户输入。然后在后端,它将根据UI的查询条件组装SQL语句,例如,如果用户在UI中键入/选择以下内容 Field Name Operator Value origin

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

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

1.字段名,其值是固定的,例如原点、最终测试

2.运算符,它是一个选择列表,包括“喜欢”、“不喜欢”、“在”、“不在”、“在”、“=”、“!=”

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

Field Name       Operator       Value
origin           like           CHI
finalDest        in             SEL
在后端,它将生成以下SQL:

从来源为“%CHI%”和最终登录(“SEL”)的预订中选择*。

但是有一个bug,例如如果用户在“value”中键入一些特殊的符号,例如“'”、“u”等,则会导致生成的SQL也包含“or”,例如:

从预订中选择*源代码为“%C_HI%”和最终登录('S'EL')。

您可以看到,由于“where”块中有一个特殊的符号,SQL无法执行

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


对不起,忘了告诉你我用的是什么语言,我用的是java,数据库是mysql,我也用hibernate,有很多人说我为什么不使用PreparedStatement,这有点复杂,简单地说,在我的公司,我们有一个名为dynamic query的FW,我们在XML文件中预定义了SQL片段,然后我们将根据UI传入条件和jxel表达式来组装SQL,因为SQL是一种预定义的东西,我担心如果更改为使用PreparedStatement,我们的FW将涉及很多更改,因此,我们关心的只是如何用一种简单的方法解决SQL注入问题。

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


在语句中使用绑定变量或参数将利用内置的SQL注入保护,这将比您或我在数据库中编写的任何东西都要好。如果您在服务器端执行任何
字符串
连接以形成完整的SQL语句,则这是SQL注入风险的指标。

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

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
在语句中使用绑定变量或参数将利用内置的SQL注入保护,这将比您或我在数据库中编写的任何东西都要好。如果您在服务器端执行任何
字符串
连接以形成完整的SQL语句,则这是SQL注入风险的指标

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


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

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


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

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


假设您将此查询发送到服务器,服务器应具有只有客户端才能访问的身份验证方案,客户端应清理其数据库输入。您使用的服务器端语言是什么?您好,我使用的是mysql5+hibernate,但是我认为它不应该依赖于mysql,应该是一个通用的跨平台SQL语句。假设您将此查询发送到服务器,服务器应该有一个只有客户端可以访问的身份验证方案,客户端应该清理其数据库输入。您使用的服务器端语言是什么?您好,我使用的是mysql5+hibernate,但我认为它不应该依赖于mysql,应该是一个通用的跨平台SQL语句谢谢你的回答,但在我的例子中,SQL语句是动态组装的。所以我恐怕不能使用PreparedStatement Direct谢谢你的回答,但在我的例子中,SQL语句是动态组装的。所以我恐怕不能使用PreparedStatement Direct是的,你是对的,但我们现在的处境是这样的,如果更改为使用PreparedStatement,我认为这会影响很多我们认为已经稳定的编码。你需要做的是使用智能解决方案来解决注入问题,无论是使用转义字符还是其他什么,我希望更改不会太多。@Chailie如果您使用hibernate,它应该已经使用了PreparedStatements,我们编写的是这样的:em=emf.createEntityManager();Query Query=em.createNativeQuery(sql);ret=query.getResultList();但如果我在UI中键入单引号,它将有以下异常:17:34:40927 ERROR jdbceptionreporter:101-您的SQL语法有错误;检查与MySQL服务器版本对应的手册