背景:
我目前正在为企业 CMS 数据库(业务对象)开发 Java 前端。目前,我正在构建一个功能来允许用户构建自定义数据库查询。我已经实施了措施,以确保用户只能使用已批准用户访问的可用列和运算符的子集进行选择(例如,可以选择 SI_EMAIL_ADDRESS,而不能选择 SI_CUID 等更强大的字段)。到目前为止,一切进展顺利,但现在是时候确保此功能免受潜在的 SQL 注入攻击了。
问题:
我正在寻找一种转义用户输入字符串的方法。我已经看过 PerparedStatement,但是我被迫使用第三方 API 来访问数据库。这些 API 对我来说是不可变的,直接数据库访问是不可能的。各个方法采用表示要运行的查询的字符串,从而使PreparedStatement 无效(据我所知,它必须针对直接数据库连接运行)。
我考虑过使用 String.replace(),但如果可能的话我不想重新发明轮子。另外,我与开发PreparedStatement的安全专家相差甚远。
我还查看了 PerparedStatement 的 Java API 参考,希望找到某种 toString() 方法。唉,我一直找不到类似的东西。
任何帮助是极大的赞赏。先感谢您。
参考:
Java - 转义字符串以防止SQL注入
PHP 的 mysql_real_escape_string() 的 Java 等效项
当然使用PreparedStatement会更简单、更安全。
ANSI SQL 要求字符串文字以单引号开头和结尾,单引号的唯一转义机制是使用两个单引号:
'Joe''s Caffee'
所以理论上,你只需要用两个单引号替换一个单引号即可。然而,也存在一些问题。首先,某些数据库(例如 MySQL)也(或仅)支持反斜杠作为转义机制。在这种情况下,您还需要将反斜杠加倍。
对于 MySQL,我建议使用MySQL实用程序。如果您不使用 MySQL,那么您需要检查要使用的确切转义机制。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)