我必须创建一个正则表达式来搜索完整文件以找到与 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 根本没有被查看。