2

我们在特定服务器中遇到问题。发布到应用程序的所有加号都替换为空格 - 在 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”-request(“Plus”) 为“ 1 2 3”,查询字符串为“ 1+2+3”。不好。其他字符似乎正确解码。
应该说有人试图“强化”该服务器以抵御攻击,因此可能会打开模糊的 IIS 选项(尽管我们确实删除了 ISAPI 过滤器)。
谢谢。


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

  1. 加号用空格代替:“1%2B2”->“1+2”,同“1 2”
  2. 分号替换为逗号:“hello;” ->“你好”

较新版本的过滤器 (2.0b) 无法解决此问题,但允许排除某些页面。由于它是在生产中安装的,我们决定不删除过滤器,我们使用 javascript 将所有加号更改为"&#43 "(带空格而不是分号)。
不是最佳解决方案,但这正是老板想要的。

4

2 回答 2

1

考虑ASCII码。用它的 ascii 代码代替加号。它将是 chr(43)。asp 和 sql 都会理解这一点。

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

于 2009-05-11T16:50:34.943 回答
0

嗯,这也让我很困惑。直到我看到这篇文章:Server.URLEncode 开始用加号(“+”)而不是 percent-20(“%20”)替换空白

简而言之:

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

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

这是我的猜测,我不在乎过时的技术,有关更多详细信息,请参阅

于 2021-03-24T02:18:27.933 回答