Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
解析Java源文件中的字符串文本以查找潜在的SQL注入_Java_Regex_Parsing_Sql Injection - Fatal编程技术网

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

解析Java源文件中的字符串文本以查找潜在的SQL注入,java,regex,parsing,sql-injection,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 " +

在我们的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字符串文字,这些文字具有某种字符串连接,可能包含SQL片段,因此我可以手动检查此实例,并在必要时重写它们

我假设SQL STMT仅与SQL helper类一起使用,如:

SQL.select(...)
SQL.insert(...)
也许有帮助

一种快速而简单的方法是检查提供的字符串是否包含任何
SELECT
INSERT
UPDATE
DELETE
(不区分大小写)。如果没有这些子查询,则查询将无法运行,如果用户除了为所选字段提供正确语法之外,还提供其他任何内容,则查询将无法编译


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

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

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


如果没有,请看一看,因为我认为您也会希望在那里预防它

如果要从中选择的表中没有数量惊人的列,那么在从所有列返回信息后,可以使用someText从结果集中选择特定列


与寻找SQL注入相比,允许某些文本包含字母、数字、空格、逗号、下划线等(这些是列名中唯一合法的部分)的允许字符的白名单可能更有意义。白名单方法应该更容易实现sql注入搜索。

与其试图阻止注入案例,不如更容易限制
someText
实际包含的内容。看起来您只希望它具有来自
公司
表的其他列名或对它们的函数调用,但是您还希望允许其他事情吗?他不能,因为他正在使用自己的sql库(这本身是个坏主意,但这不是这里的问题)