这是我的应用程序的查询模块中的一个关键字冲突问题,请查看您是否可以告诉我一个智能解决方案。
首先,在查询模块中,每个查询条件在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注入问题。答案 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文档: