正如所指出的,您的问题不是您的正则表达式,而是您通过 发送的数据DefaultEncoder.getValidInput(args...)
包含某种形式的混合编码。
您不会过多地讨论上下文,但一般来说,您接受的答案存在极大的致命缺陷,不应作为建议推荐给任何人。
您的输入失败,因为已确定,ESAPI 将规范化您的输入,然后将其传递给正则表达式进行验证。规范化真正为您提供的是两件事,但最重要的是 ESAPI 的实现将检测多重编码攻击。
什么是多重编码?它试图通过多次编码一段数据来破坏输入验证。使用百分比编码,它看起来像这样:
ORIGINAL INPUT:
<script>alert('xss');</script>
ENCODED ONCE:
%3Cscript%3Ealert(%27xss%27)%3B%3C%2Fscript%3E
ENCODED TWICE:
%253Cscript%253Ealert(%2527xss%2527)%253B%253C%252Fscript%253E
您的回答,您建议仅关闭百分比编解码器,这给您的应用程序引入了一个巨大的安全漏洞,您无法再检测到攻击是否试图破坏您的输入验证例程。百分比编码是一种非常标准的攻击技术。有多种方法可以尝试将代码强制转换为涉及多种编码技术的应用程序。
您在这里真正需要的是更好地讨论为什么您的应用程序正在处理的输入需要使用您正在使用的输入类型。什么是具有更大图景的一些示例数据的实际用例?有了你面前的一切,我唯一能做的就是清楚地说明删除百分比编解码器会让你容易受到攻击。
如果你想在没有规范化的情况下临时验证 ESAPI 有
Validator.getValidInput(String context, String input, String type, int maxLength, boolean allowNull, boolean canonicalize);
这允许您暂时关闭规范化。
但是,规范化是存在的,因此您可以确保您正在处理的输入可以安全地用于正则表达式。