% 2B декодирование в пробел вместо плюса - PullRequest
1 голос
/ 11 мая 2009

У нас проблема с конкретным сервером. Все знаки плюса, размещенные в приложении, заменяются пробелами - в 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" - запрос ("Плюс") равен "1 2 3", а строка запроса - "1+2+3". Не хорошо. Другие символы, похоже, правильно декодируют.
Следует сказать, что кто-то пытался «защитить» этот сервер от атак, поэтому могут быть включены непонятные параметры IIS (хотя мы и удалили фильтр ISAPI).
Спасибо.


UPDATE: Оказывается, установлен еще один фильтр, SQL-фильтр ISAPIClipSQLInjection.dll от http://www.codeplex.com/IIS6SQLInjection.
Фильтр содержит ошибки - он заменяет действительные символы из POST и GET:

  1. Знаки плюс заменяются пробелами: «1% 2B2» -> «1 + 2», так же, как «1 2»
  2. Точки с запятой заменяются запятыми: "привет"; -> «Привет»

Более новая версия фильтра (2.0b) не исправляет это, но позволяет исключить определенные страницы. Поскольку он установлен в производство, мы решили не удалять фильтр, мы использовали javascript, чтобы изменить все плюсы на "&#43 " (с пробелом, а не точкой с запятой).
Не оптимальное решение, но это то, что хотел начальник.

1 Ответ

1 голос
/ 11 мая 2009

Рассмотрим код Ascii. Вместо знака плюс используйте его код ascii. Это будет chr (43). Это понимают и asp, и sql.

вот таблица со всеми кодами ascii. http://www.asciitable.com/

...