这是我的应用程序的查询模块中的一个关键字冲突问题,请看是否可以告诉我一个智能解决方案。
首先,在查询模块中,每个查询条件包含UI中的三个部分:
1.字段名,其值是固定的,例如原点,finalDest.
2.运算符,它是一个选择列表,包括“喜欢”、“不喜欢”、"in“、”不是in“、"=”、“!”
3.值,此部分由user.then在后端输入,它将根据用户界面的查询条件组装SQL语句,例如用户在用户界面中键入/选择以下内容
Field Name Operator Value
origin like CHI
finalDest in SEL在后端,它将生成以下SQL:
从预订处选择*,如'%CHI%‘和’finalDest‘in ('SEL').
但是有一个bug,例如,如果用户在"value“中键入一些特殊符号,例如”‘’“、"_”等等,它将导致生成的SQL还包含‘或__,例如:
从预订处选择*,如“%C_HI%”和finalDest in (‘S’‘EL’).
您可以看到,在"where“块中有特殊的符号,因此不能执行SQL
对于这个问题,我的解决方案是在执行之前在特殊符号前面添加转义字符"/“,但我知道的是‘或_这将与SQL关键字冲突,您知道我是否还有其他类似的符号需要处理,或者你们有什么更好的方法可以避免注入吗?
对不起,忘了告诉你我用的是什么语言,我用的是java,数据库是mysql,我也使用hibernate,有很多人说我为什么不使用PreparedStatement,这有点复杂,简单地说,在我的公司里,我们有一个名为动态查询的FW,我们在XML文件中预定义了SQL片段,然后我们用jxel表达式根据用户界面传递的条件组装SQL,因为SQL是预定义的东西,我担心如果改变使用PreparedStatement,它会对我们的FW带来很多变化,因此,我们关心的只是如何用一种简单的方法解决SQL注入问题。
发布于 2013-07-08 08:36:19
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-08 08:36:05
在向数据库发送任何信息之前,代码应该开始尝试停止服务器端的SQL注入。我不确定您使用的是哪种语言,但这通常是通过创建包含某种绑定变量的语句来实现的。在Java中,这是一个PreparedStatement,其他语言也包含类似的特性。
在语句中使用绑定变量或参数将利用内置的SQL注入保护,这将比您或我在数据库上所写的任何东西都要好。如果您在服务器端执行任何String连接以形成完整的SQL语句,则这是SQL注入风险的指示符。
发布于 2013-07-08 08:44:07
您应该在SQL语句中使用绑定变量。如前所述,这是在Java中的PreparedStatements中完成的。
为了确保只使用有效的列名,可以根据数据库验证输入。MySQL作为INFORMATION_SCHEMA的一部分提供了类似于每个表的列的架构信息。有关更多信息,请查看MySQL文档:
模式列表“
https://stackoverflow.com/questions/17522116
复制相似问题