从Java源文件中解析字符串文字以查找潜在的SQL注入

时间:2011-03-21 14:21:25

标签: java regex parsing sql-injection

在我们的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(...)

3 个答案:

答案 0 :(得分:1)

也许this question有帮助。

快速而简单的方法可以是检查提供的字符串是否包含SELECTINSERTUPDATEDELETE(不区分大小写)。如果这些子查询不起作用,并且如果用户除了选择字段的正确语法之外还提供其他任何内容,则查询将无法编译。

此外,执行语句的用户(很可能是某些系统用户)不应该具有更改数据库结构的权限,即根本没有DROP,ALTER XYZ等语句。

答案 1 :(得分:1)

如果someText始终是列的列表,那么您可以对其执行一些验证。 (即使它与列列表不同,您也可以执行一些验证)。您至少可以在逗号上拆分它,并确保结果数组中的每个元素都是有效的列名。这样可以防止在该空间中注入SQL。

为什么你没有在companyNr和languageUid中提到过这种可能性?你在幕后做某事吗?

如果没有,请查看Java - escape string to prevent SQL injection,因为我认为您也希望在那里阻止它。

答案 2 :(得分:1)

如果您选择的表中没有列有淫秽数量的列,则可以在从所有列返回信息后使用someText从结果集中选择特定列。

不是寻找SQL注入,而是允许someText的允许字符的白名单更有意义,包括字母,数字,空格,逗号,下划线等,这些是列名的唯一合法部分。白名单方法应该更容易实现sql注入的搜索。