gpt4 book ai didi

java - 匹配完整文件正则表达式中的 A 部分,但不匹配 B 部分

转载 作者:行者123 更新时间:2023-12-02 06:54:08 30 4
gpt4 key购买 nike

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

我正在搜索 java 文件以查找 DocumentBuilderFactory,并且我正在寻找初始化的变量随后通过下面的 setFeature 或 setEntity 运行的情况,或者查找变量所在的 SAXParserFactory < em>不运行下面的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 根本没有被查看。

最佳答案

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

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

我能找到的唯一方法是将正前瞻放在负前瞻中,这可能不受某些引擎支持,并且运行速度相当慢。

关于java - 匹配完整文件正则表达式中的 A 部分,但不匹配 B 部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17619521/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com