我在java项目中使用org.owasp.esapi
。我使用ESAPI.encoder().forHTML()
方法对用户输入进行编码,但这种方法将'&'编码为&;&&;但我不想改变'&'所以我想把'&'字符列入白名单,编码器不编码它。那么我该如何更改ESAPI呢?属性文件,使编码器将此方法列入白名单。
请帮我找到白名单字符的属性。
ESAPI故意不提供一种将附加字符列入白名单的简单方法。许多人在没有意识到后果的情况下提出了这样的要求。(在这种情况下,它可能允许来自双重编码的攻击。)因此,这样做的唯一方法是编写自己的编码器,通过为ESAPI指定自己的类来替换org.owasp.esapi.reference.DefaultEncoder
。编码器不建议您这样做。
那就是说,如果我可以问,你想要解决的具体问题是什么?通常只有一两个特定的字段他们需要允许一些字符被渲染,其中一个通常被阻止,它是双编码的,所以'&'显示为'&'例如。如果你解释一下你想要做的具体情况,我们可以建议一些比你建议的更危险的替代方案。
这是另一种方法。我不建议这样做,因为很难做到正确。让XSS专家检查您的代码,然后使用DAST工具或使用OWASP ZAP或Portswigger Burp Suite之类的工具进行一些广泛的测试。
我没有检查任何代码,甚至没有尝试编译它,所以你已经被警告了!
第二个警告,我不记得曾经见过一个合法的地址需要一个'&',所以也许这只是一些边缘用例,我不完全理解。但是正如我在第一个回答中所说,ESAPI不允许用户指定他们自己的一组"免疫"是有原因的。不被编码的字符。
也就是说,如果您希望编写一个自定义编码器,您可以这样做,但这取决于您希望'address'允许的其他特殊字符(例如,可能是'-',','和')。',但希望不是';'或'%'),可能有一个更简单的方法,那就是只使用严格的allow-list自定义验证。您可以通过在ESAPI 'validationproperties中添加自定义正则表达式来实现这一点。的文件。例如,可能像这样:
# Allow any combination of upper or lower case alphabetic chars, digits, space,
# common, period, ampersand, or hypen. Require a length between 8 and 256 characters.
Validator.Address="^[A-Za-z0-9 ,.&-]{8,256}$"
(注意:如果你想让'-'被允许,你必须将其作为正则表达式字符类中的第一个或最后一个字符。)
然后将该正则表达式与Validator.getValidInput
或Validator.isValidInput
方法之一结合使用。
String allowedAddr = ESAPI.validator().getValidInput(
"Customer address", // descriptive name for logs
addressParam, // actual user input
"Address" // name of your regex
false, // no null / empty strings
true); // canonicalize input before validation
请记住,此操作的安全性在很大程度上取决于您希望在地址中允许哪些字符。
此外,最后一个参数可能需要为'false',因为根据ESAPI.properties的设置,addressParam
输入中的'&'可能会触发它。文件。