0

我必须创建一个正则表达式来搜索完整文件以找到与 Java XML 解析器第一部分的匹配项,但不是第二部分。这将用于防止某些 XXE 攻击。不幸的是,它必须是单个正则表达式,并且确实需要搜索整个文件(而不是逐行)。

我正在搜索 java 文件以查找 DocumentBuilderFactory 并且我正在寻找初始化变量然后通过下面的 setFeature 或 setEntity 运行的情况,或者找到 SAXParserFactory ,其中变量然后通过下面的 setFeature 运行。

以下是我希望正则表达式失败的情况:

案例A(简单案例):

DocumentBuilderFactory docBuilderFactory = DocumentBuilderFactory.newInstance();
...
docBuilderFactory.setFeature("http://xml.org/sax/features/external-general-entities", false);

案例 B(多行):

DocumentBuilderFactory docBuilderFactory = DocumentBuilderFactory
.newInstance();
...
docBuilderFactory
.setExpandEntityReferences(false);

案例 C(使用 SAXParser 而不是 DocumentBuilder):

SAXParserFactory spf = SAXParserFactory.newInstance();
...
spf.setFeature("http://xml.org/sax/features/external-general-entities", false);

重申一下,我希望正则表达式能够找到 DocumentBuilderFactory 或 SAXParserFactory 后面没有 setFeature 或 setExpandEntity 的情况。

这是我到目前为止所拥有的(希望格式化以便更好地理解):

DocumentBuilderFactory (\w+).*=.*DocumentBuilderFactory
[\n|\r]?.*?
\.
[\n|\r]?.*?
newInstance\(\)
(?>.|\n|\r)*
(\1[\n|\r]?.*?\.[\n|\r]?.*?setExpandEntityReferences\(false\)
|\1[\n|\r]?.*?\.[\n|\r]?.*?setFeature\("http://xml.org/sax/features/external-general-entities", false\)
|\1[\n|\r]?.*?\.[\n|\r]?.*?setFeature\("http://apache.org/xml/features/disallow-doctype-decl", false\)).*

|SAXParserFactory (\w+).*=.*SAXParserFactory
[\n|\r]?.*?
\.
[\n|\r]?.*?
newInstance\(\)
(?>.|\n|\r)*
(\1[\n|\r]?.*?\.[\n|\r]?.*?setFeature\("http://xml.org/sax/features/external-general-entities", false\)
|\1[\n|\r]?.*?\.[\n|\r]?.*?setFeature\("http://apache.org/xml/features/disallow-doctype-decl", false\)).*

我很难制作这些 setFeatures 以便找不到它们,而且我很确定 setFeatures 根本没有被查看。

4

1 回答 1

2

当您添加必须在单个全局正则表达式中执行此操作的限制时,这是一个棘手的问题,但只要您设置 . 匹配换行符:

(?:DocumentBuilderFactory|SAXParserFactory)[\s\r\n]+?(\w+)[\s\r\n]*?=[\s\r\n]*?(?:DocumentBuilderFactory|SAXParserFactory)[\.\r\n]+newInstance(?!.*\1(?=[\.\r\n]+(:?setFeature|setExpandEntity)))

我能找到的唯一方法是将积极的前瞻放在负的前瞻中,某些引擎可能不支持它,并且运行速度很慢。

于 2013-07-12T17:00:57.847 回答