在我们的Java项目中,我需要在java源文件中找到潜在的SQL注入。
我们使用自己的Java-SQL前端类,所有相关的SQL查询都采用以下形式:
String someText = "potential SQL injection";
SQL.selectInto(
"SELECT C.LANGUAGE, " +
someText +
"FROM COMPANY C " +
"WHERE C.COMPANY_NR = :companyNr " +
"INTO :languageUid ",
new NVPair("companyNr", companyNr),
new NVPair("languageUid", languageUid)
);
问题是,变量“someText”可能包含另一个可能导致SQL注入的SQL字符串。
我正在寻找一种方法(正则表达式,java解析器等等)来查找所有带有SQL的java-string文字,它有某种字符串连接,可能包含一个SQL-snippet,所以我可以手动检查这个实例,并在必要时重写它们。
我假设SQL-stmts仅用于SQL辅助类,如:
SQL.select(...)
SQL.insert(...)
答案 0 :(得分:1)
也许this question有帮助。
快速而简单的方法可以是检查提供的字符串是否包含SELECT
,INSERT
,UPDATE
或DELETE
(不区分大小写)。如果这些子查询不起作用,并且如果用户除了选择字段的正确语法之外还提供其他任何内容,则查询将无法编译。
此外,执行语句的用户(很可能是某些系统用户)不应该具有更改数据库结构的权限,即根本没有DROP,ALTER XYZ等语句。
答案 1 :(得分:1)
如果someText始终是列的列表,那么您可以对其执行一些验证。 (即使它与列列表不同,您也可以执行一些验证)。您至少可以在逗号上拆分它,并确保结果数组中的每个元素都是有效的列名。这样可以防止在该空间中注入SQL。
为什么你没有在companyNr和languageUid中提到过这种可能性?你在幕后做某事吗?
如果没有,请查看Java - escape string to prevent SQL injection,因为我认为您也希望在那里阻止它。
答案 2 :(得分:1)
如果您选择的表中没有列有淫秽数量的列,则可以在从所有列返回信息后使用someText从结果集中选择特定列。
不是寻找SQL注入,而是允许someText的允许字符的白名单更有意义,包括字母,数字,空格,逗号,下划线等,这些是列名的唯一合法部分。白名单方法应该更容易实现sql注入的搜索。