Java 使用ESAPI时允许百分比符号的模式

Java 使用ESAPI时允许百分比符号的模式,java,regex,symbols,esapi,Java,Regex,Symbols,Esapi,我正在使用RegEx^[\\p{L}\\p{N}:\\-.\\s\&,$\\*%]*$使用ESAPI验证其中一个字段 如果我的输入为1234%或1234%%或1234%%%或%1,则认为是真的。 但是,如果我可以输入%12或1234%12或1234%%12,它将失败 据我观察,%符号后不允许有多个字符/数字 请问我的正则表达式是否有错误? 正则表达式模式应该是什么,以允许任何数量的%符号后跟或后跟任何有效字符 提前感谢。Nirav如果您尝试使用数字,请尝试使用下面的正则表达式。 \d*%+\d*

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

如果我的输入为1234%或1234%%或1234%%%或%1,则认为是真的。 但是,如果我可以输入%12或1234%12或1234%%12,它将失败

据我观察,%符号后不允许有多个字符/数字

请问我的正则表达式是否有错误? 正则表达式模式应该是什么,以允许任何数量的%符号后跟或后跟任何有效字符


提前感谢。

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


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

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


它将匹配您的模式,包括%后跟或后跟数字。

感谢您对NaveedS和GauravM的帮助

我能够弄清楚确切的问题。这是ESAPI的核心问题,同时支持%

在进行实际的模式匹配之前,ESAPI用于规范化输入字符串。 这种规范化涉及使用各种编解码器,如javascript编解码器、HTML代码、百分比编解码器。 百分比编解码器扫描输入字符串中的%symbol,并将其视为转义字符。它将接下来的两个文字视为十六进制数,即在示例%123中,它将12视为十六进制,即18视为十进制,因此向上箭头符号视为等效字符。 因此,在canocilization之后,输入字符串转换为UPARROW3,但在RegEx^[\\p{L}\\p{N}:\\-.\\s\&,$\\*%]*$中不允许UPARROW3,这是失败的。 作为一种解决方法,在将字符串传递给ESAPI进行验证之前,我们可以删除字符串中的所有百分比,并在末尾附加一个%。 这将执行相同的验证

但是,对于类似正则表达式的Validator.Email=^[A-Za-z0-9.\uz%-]+@[A-Za-z0-9.-]+\.[A-Za-Z]{2,4}$这种变通方法不起作用

作为这种特殊情况下的替代方案,可以编写自己的正则表达式,显式地允许结尾段中的百分比,如Validator.own.Email=^[A-Za-z0-9.\u%-]+@[A-Za-z0-9.-]+\.[A-Za-Z%]{3,5}$


希望这能有所帮助。

感谢您对NaveedS和GauravM的帮助

我能够弄清楚确切的问题。这是ESAPI的核心问题,同时支持%

在进行实际的模式匹配之前,ESAPI用于规范化输入字符串。 这种规范化涉及使用各种编解码器,如javascript编解码器、HTML代码、百分比编解码器。 百分比编解码器扫描输入字符串中的%symbol,并将其视为转义字符。它将接下来的两个文字视为十六进制数,即在示例%123中,它将12视为十六进制,即18视为十进制,因此向上箭头符号视为等效字符。 因此,在canocilization之后,输入字符串转换为UPARROW3,但在RegEx^[\\p{L}\\p{N}:\\-.\\s\&,$\\*%]*$中不允许UPARROW3,这是失败的。 作为一种解决方法,在将字符串传递给ESAPI进行验证之前,我们可以删除字符串中的所有百分比,并在末尾附加一个%。 这将执行相同的验证

但是,对于类似正则表达式的Validator.Email=^[A-Za-z0-9.\uz%-]+@[A-Za-z0-9.-]+\.[A-Za-Z]{2,4}$这种变通方法不起作用

作为这种特殊情况下的替代方案,可以编写自己的正则表达式,显式地允许结尾段中的百分比,如Validator.own.Email=^[A-Za-z0-9.\u%-]+@[A-Za-z0-9.-]+\.[A-Za-Z%]{3,5}$

希望这能有所帮助。

如果不是真的需要,最好的选择是排除百分比编解码器

要做到这一点,需要编写自己的定制编码器实现,扩展ESAPI提供的org.owasp.ESAPI.reference.DefaultEncoder,并将其注册到ESAPI.properties,如

请参见下面的实现示例

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);
      }
}
在这个定制的编码器中,不应该注册百分比编解码器,而应该只注册真正需要的编解码器。要查看所有ESAPI编解码器,请访问ESAPI文档。

如果不需要,最好排除百分比编解码器

要做到这一点,需要编写自己的定制编码器实现,扩展ESAPI提供的org.owasp.ESAPI.reference.DefaultEncoder,并将其注册到ESAPI.properties,如

请参见下面的实现示例

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);
      }
}

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

如前所述,您的问题不是您的正则表达式,而是您通过DefaultEncoder.getValidInputargs发送的数据。。。包含某种形式的混合编码

你不会对上下文进行更多的讨论,但一般来说,你给出的答案是有致命缺陷的,不应该被推荐给任何人

您的输入失败,因为正如所标识的那样,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.getValidInputString上下文、字符串输入、字符串类型、int maxLength、布尔allowNull、布尔规范化

这允许您暂时关闭规范化


然而,规范化是存在的,因此您可以在某种程度上保证您正在处理的输入可以安全地用于正则表达式

正如前面所指出的,问题不在于正则表达式,而在于通过DefaultEncoder.getValidInputargs发送的数据。。。包含某种形式的混合编码

你不会对上下文进行更多的讨论,但一般来说,你给出的答案是有致命缺陷的,不应该被推荐给任何人

您的输入失败,因为正如所标识的,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.getValidInputString上下文、字符串输入、字符串类型、int maxLength、布尔allowNull、布尔规范化

这允许您暂时关闭规范化


然而,规范化是存在的,因此您可以在某种程度上保证您正在处理的输入可以安全地用于正则表达式

这很奇怪。。。正确的是,如果1234% %是真的,那么1234% % 12也应该是真的……你的正则表达式匹配任何字符,考虑在[0和0 ]或更多次中所包含的转义序列的含义。@ NaveReavy-是的,我能够放置任意数量的字符/数字等,并得到验证结果为真,但不仅仅是在%符号后面有多个文字。这很奇怪。。。正确的是,如果1234% %是真的,那么1234% % 12也应该是真的……你的正则表达式匹配任何字符,考虑在[0和0 ]或更多次中所包含的转义序列的含义。@ NaveReavy-是的,我能够放置任意数量的字符/数字等,并得到验证结果为真,但不仅当%sign.%后面有多个文字时,还可以在其后加上任何有效字符。不仅仅是数字。@Gaurav M。。它也很难工作:事实上,我希望不仅允许数字,而且允许更多的其他符号/字符(如RegEx中定义的)。%可以由任何有效字符前后。不仅仅是数字。@Gaurav M。。它太难用了:事实上,我想允许的不仅仅是数字,还有更多的其他符号/字符,如正则表达式中定义的。如果你没有精心设计的防御策略,这一个是危险的。删除PercentageCodec意味着ESAPI将不会扫描输入字符串中的多个编码攻击,这意味着您削弱了安全性
你的申请的真实性。下面的解决方案更好,你可以通过正则表达式来管理它。如果你没有精心设计的防御策略,这是很危险的。删除PercentageCodec意味着ESAPI不会扫描您的输入字符串以防多次编码攻击,这意味着您削弱了应用程序的安全性。下面的解决方案更好,您可以通过regex进行管理。我的应用程序中有一个用例,其中%xxx用作通配符搜索字符串。关闭规范化不是一个选项。你知道如何处理吗?我的应用程序中有一个用例,其中%xxx被用作通配符搜索字符串。关闭规范化不是一个选项。你知道怎么处理吗?