【发布时间】:2013-07-15 15:57:21
【问题描述】:
我的一个 REST API 有一个名为“partners”的查询参数,它是一个整数列表,因此您可以在 URL 中指定多个值。作为 XSS 攻击的预防措施,我使用 ESAPI 去除输入中的恶意内容。问题来了:
我注意到 ESAPI 编码器 cannonicalize 方法(它使用默认编解码器:HTMLEntityCodec、PercentCodec、JavaScriptCodec)更改了查询参数值,因为它认为 &p 或 &pa 是某种编码。请参阅下面的示例
类似
http://localhost:8080/product?partner=1
按预期工作。
另一方面,像
http://localhost:8080/product/?pidentity=1&pidentity=2
规范化后的输入变成
`pidentity=1πdentity=2`
框架认为这只是一个带有 2 个拆分器的查询参数,因此无法解析。
如果请求的url是这样的
http://localhost:8080/product?partner=1&partner=2
规范化后的输入变成
partner=1∂rtner=2
&pa 变成了 '∂'。
您可能已经猜到了,我尝试更改查询参数的名称并且效果很好(可能是因为没有任何相应的编码)。有没有人见过,或者可以指导我是什么导致了这种行为?这听起来像是我的经验不足,但为了确保防止 XSS 攻击,我不确定是否应该尝试从默认编码器中删除任何编解码器。
【问题讨论】:
-
在进一步调查中,它看起来像是造成问题的 HTMLEntityCodec。它将 pi 更改为 π 并将 &pa 更改为 ∂。