我正在创建一个连接到多个第三方 API 的项目。因此,作为审计,我跟踪发送到这些 API 和从这些 API 发出的所有请求和响应。这些请求和响应采用 XML 形式。这些 XML 请求和响应包含一些我需要屏蔽的敏感信息,例如 PII 和信用卡号。
这些是 XML 中可用的示例标记
<myTag>someSensitiveInformation</myTag>
<myTag sensitiveInfo = foo, sensitiveTwo = bar>SomeOtherSensitiveInfo</myTag>
<myTag sensitiveInfo = foo, sensitiveTwo = bar>
我可以使用以下正则表达式掩盖它们
(<myTag)([\s\S]*?)(\/>)|(<myTag)([\s\S]*?)(>)([\s\S]+?)(<\/myTag>)
上述所有情况下的屏蔽标签将如下所示,
<myTag>*************</myTag>
这工作得很好。但当流量很高时,这种正则表达式评估会导致 CPU 峰值,有时整个项目都会卡住。其中一些 XML 请求和响应的大小约为 100kb。我确实有与单个用户操作相对应的多个请求和响应,所有这些请求和响应都应该从上面的正则表达式中屏蔽,并且当我的项目流量较低时会屏蔽这些请求和响应。
有没有优化的方法来做到这一点。是的,我知道不建议使用正则表达式来识别 XML 标签,但这似乎是最简单的方法。任何在不牺牲性能的情况下执行此类屏蔽的外部库,我不喜欢使用 log4j
屏蔽,因为它似乎会在 JVM 内累积日志。或者对于这种情况,java中合适的解决方案是什么。
提前致谢。
最佳答案
不要使用正则表达式来处理 XML。首先,它的效率可能非常低。其次,在这种情况下更重要的是,它几乎总是不正确的;知道您在做什么的攻击者将能够构造出破坏您的正则表达式的 XML,例如,通过小心地将注释、空格或 namespace 声明插入到您正在查找的标签中。
您的目标似乎很困惑:您要求一种“优化”方式,但您使用正则表达式是因为它“最简单”。另外,您还没有说“屏蔽”数据应该是什么样子(不要指望我从正则表达式对您的要求进行逆向工程 - 您可能会发现正则表达式很容易编写,但没有人发现它们很容易阅读)。
如果您有性能要求,则需要对其进行量化。如果你无法量化它,那么尝试用 XSLT 进行编码,看看它是否足够快;我的猜测是,几乎可以肯定是这样。如果您确实需要比这更好的性能,那么尝试在 SAX 中实现;但你距离“最简单”还有很长的路要走。
在 XSLT 3.0 中,它很简单:
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="3.0">
<xsl:mode on-no-match="shallow-copy"/>
<xsl:template match="myTag">
<myTag>**************</myTag>
</xsl:template>
</xsl:transform>
我认为在所有方面都与您的正则表达式解决方案相比较:性能、可读性,以及最重要的正确性。
关于java - 在 Java 中屏蔽 XML 中敏感数据的性能优化方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61494951/