在Java中转义SQL字符串

pho*_*594 6 java sql business-objects

背景:

我目前正在为企业CMS数据库(Business Objects)开发Java前端.目前,我正在构建一个功能,允许用户构建自定义数据库查询.我已经实施了一些措施来确保用户只能使用已批准用户访问的可用列和运算符的子集进行选择(例如,可以选择SI_EMAIL_ADDRESS,而不能使用更强大的字段,如SI_CUID).到目前为止,事情一直在流动,但现在是时候保护此功能免受潜在的SQL注入攻击.

问题:

我正在寻找一种方法来逃避用户输入字符串.我已经看过PerparedStatement,但是我被迫使用第三方API来访问数据库.这些API对我来说是不可变的,直接的数据库访问是不可能的.各个方法接受表示要运行的查询的字符串,从而使PreparedStatement无效(据我所知,必须针对直接数据库连接运行).

我考虑过使用String.replace(),但如果可能的话我不想重新发明轮子.另外,我与开发PerparedStatement的安全专家相去甚远.

我还查看了PerparedStatement的Java API参考,希望找到某种toString()方法.唉,我一直都找不到那种东西.

任何帮助是极大的赞赏.先感谢您.

参考文献:

Java - 转义字符串以防止SQL注入

Java的等价于PHP的mysql_real_escape_string()

Tho*_*ler 2

当然使用PreparedStatement会更简单、更安全。

ANSI SQL 要求字符串文字以单引号开头和结尾,单引号的唯一转义机制是使用两个单引号:

'Joe''s Caffee'
Run Code Online (Sandbox Code Playgroud)

所以理论上,你只需要用两个单引号替换一个单引号即可。然而,也存在一些问题。首先,一些数据库(例如 MySQL)也(或仅)支持反斜杠作为转义机制。在这种情况下,您还需要将反斜杠加倍。

对于 MySQL,我建议使用MySQLUtils。如果您不使用 MySQL,那么您需要检查要使用的确切转义机制。