%2B解码到空格而不是加号

时间:2009-05-11 06:23:11

标签: iis encoding asp-classic isapi

我们在特定服务器中遇到问题。发布到应用程序的所有加号都将替换为空格 - 即POST和GET,以及该站点上的所有页面。 作为测试用例,我有这个小页面(它是一个ASP服务器):

<html>
<body>
  <form method="post">
    <input type="text" name="Plus" id="Plus" />
    <input type="submit" />
  </form>
  Previous Value: <%= request("Plus") %><br />
  Query String: <%= request.querystring %>
</body>
</html>

在其他所有服务器上运行良好,但在一台服务器上,用空格替换了 示例:输入“1 2+3” - 请求(“Plus”)为“1 2 3”,查询字符串为“1+2+3”。不好。其他字符似乎正确解码。
应该说有人试图“强化”这台服务器免受攻击,因此可能会打开模糊的IIS选项(虽然我们确实删除了ISAPI过滤器)。 感谢。


更新: 事实证明,安装了另一个过滤器,来自http://www.codeplex.com/IIS6SQLInjection的SQL注入过滤器ISAPIClipSQLInjection.dll。 过滤器有问题 - 它取代了POST和GET中的有效字符:

  1. 加号用空格代替:“1%2B2” - &gt; “1 + 2”,与“1 2”相同
  2. 用逗号代替分号:“你好;” - &GT; “你好”,
  3. 较新版本的过滤器(2.0b)无法解决此问题,但允许排除某些页面。由于它已在生产中安装,我们决定不删除过滤器,我们使用javascript将所有加号更改为"&#43 "(带空格而不是分号)。
    不是最佳解决方案,但这就是老板想要的。

2 个答案:

答案 0 :(得分:1)

考虑Ascii Code。在加号的位置使用其ascii代码。它将是chr(43)。 asp和sql都能理解这一点。

这是一个包含所有ascii代码的表。 http://www.asciitable.com/

答案 1 :(得分:0)

嗯,这也让我很困惑。直到我看到这个帖子:Server.URLEncode started to replace blank with plus ("+") instead of percent-20 ("%20")

简而言之:

  • RFC-1866(大约 1995 年),声明应将请求正文中的空白“”解析为“+”。
  • RFC-3986 (2005, Jan) 声明应该将空白“”解析为“%20”

而在ASP框架中,它支持RFC-1866,有时会混合RFC-3986(似乎),所以参数%2b首先转换为+(正常的ascii/urldecode规则,然后它转换为 (RFC-1866 规则)

这是我的猜测,我不在乎过时的技术,欲了解更多详情,请参阅