使用owasp.esapi来过滤传入的请求参数和标题,我在一个问题上磕磕绊绊,显然Referer标题包含一个被认为是使用“多重编码”的值。
一个例子:
http://123.abc.xx/xyz/input.xhtml?server=http%3A%2F%2F123.abc.xx%3A7016%2Fxyz&o=1&language=en&t=a074faf3
但是对我来说,这个URL似乎是正确编码的,并且解码它会产生一个完全可读和正确的URL。
那么,任何人都可以在这里解释这个问题,以及如何处理这个问题?
在标头值上运行此方法时,ESAPI报告错误:
value = ESAPI.encoder().canonicalize(value);
输出:
SEVERE: [SECURITY FAILURE] INTRUSION - Mixed encoding (2x) detected
事实上是的。我在即将发布的ESAPI版本中修复了这个错误,但它需要进行API更改,也许可能会根据您的数据在此处发生错误。
简而言之,在我修复之前,ESAPI只针对URI执行了一个正则表达式。关于这个问题和错误报告的问题是,URI不是常规语言。它们本身就是一种语言。所以会发生的问题是,所讨论的URI将包含包含HTML实体的参数,只有一些随机数据变体会与已知的HTML实体对齐,例如¶m=foo
,它将被解释为实体¶
,即段落。关于ASCII与Unicode(非bmp编码)也存在一些问题。
无论如何,我们的下一个库Encoder.getCanonicalizedURI();
将会有一种新方法用于候选版本
这对于正则表达式是安全的,因为它将被分解并检查混合/多重编码。您目前使用的方法现已弃用。