2

我正在使用 RegEx^[\\p{L}\\p{N}:\\-.\\s_&.,$()\\*%]*$使用 ESAPI 验证其中一个字段。

如果我的输入是1234%1234%%1234%%%%1它被视为 TRUE。但是,如果我可以输入%12或者它失败了。1234%121234%%12

我的观察是它不允许在%symbol之后超过一个字符/数字。

我可以知道我的 RegEx 中是否有任何错误吗?RegEx 模式应该是什么,以允许%任何有效字符后面或前面有任意数量的符号?

提前致谢。

4

4 回答 4

3

正如所指出的,您的问题不是您的正则表达式,而是您通过 发送的数据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);

这允许您暂时关闭规范化。

但是,规范化是存在的,因此您可以确保您正在处理的输入可以安全地用于正则表达式。

于 2015-04-19T20:47:08.607 回答
2

感谢您对 NaveedS 和 GauravM 的帮助。

我能够弄清楚确切的问题。支持 %. 是 ESAPI 的核心问题。

  • 在进行实际的模式匹配之前,ESAPI 用于规范化输入字符串。
  • 这种规范化涉及使用各种编解码器,如javascript 编解码器、HTML 代码、百分比编解码器
  • 百分比编解码器扫描输入字符串中的%符号,并将其视为转义字符。它将接下来的两个文字视为HEX 数字,即在 example 中%123,它认为12Hex,即十进制,因此符号为18Character等价物。UP ARROW
  • 因此,在规范化之后,输入字符串转换为UPARROW3,但UPARROW在 RegEx 中不允许^[\\p{L}\\p{N}:\\-.\\s_&.,$()\\*%]*$,它失败了。

作为一种解决方法,在将字符串传递给 ESAPI 进行验证之前,我们可以删除字符串中的所有百分比并在末尾附加一个 %。这将执行相同的验证。

但是,对于 RegEx 这样Validator.Email=^[A-Za-z0-9._%-]+@[A-Za-z0-9.-]+\\.[a-zA-Z]{2,4}$的解决方法将不起作用。

在这种特殊情况下,作为一种替代方法,可以编写自己的 RegEx(明确允许末尾段中的百分比),例如Validator.own.Email=^[A-Za-z0-9._%-]+@[A-Za-z0-9.-]+\\.[a-zA-Z%]{3,5}$

希望这可以帮助。

于 2013-01-18T05:06:26.297 回答
0

Nirav 如果您尝试使用数字,请尝试使用下面的正则表达式。(\d*%+\d*)+

它将匹配您的模式,其中包括 % 后面或前面的数字。

于 2013-01-14T12:37:49.050 回答
-1

好的选择是排除 Percentage codec,如果它不是真的需要的话。

为此,需要编写自己的自定义编码器实现,扩展提供的 ESAPIorg.owasp.esapi.reference.DefaultEncoder并将其注册为ESAPI.properties喜欢

ESAPI.Encoder=path.to.ESAPIDefaultEncoderImpl

请参见下面的实现示例。

package path.to;

import java.util.ArrayList;
import java.util.List;

public class ESAPIDefaultEncoderImpl extends org.owasp.esapi.reference.DefaultEncoder
{
private static List<String> codecs;
private static ESAPIDefaultEncoderImpl singletonInstance ;

static
{
    codecs = new ArrayList<String>();
    codecs.add("HTMLEntityCodec ");
    codecs.add("JavaScriptCodec");
    singletonInstance = new ESAPIDefaultEncoderImpl();
}

public static ESAPIDefaultEncoderImpl getInstance()
      {
        return singletonInstance;
      }
      private ESAPIDefaultEncoderImpl()
      {
         super(codecs);
      }
}

在这个定制的编码器中,不应该注册Percentage Codec ,而应该只注册真正需要的。(要查看所有 ESAPI 编解码器,请访问 ESAPI 文档)。

于 2013-10-10T06:29:16.623 回答