У меня есть приложение ASP.NET MVC с маршрутом, который позволяет искать вещи через / search / <searchterm>.
Когда я предоставляю "search / abc", он работает хорошо, но когда я предоставляю "/ search / a + b + c" (правильно закодированный URL), IIS7 отклоняет запрос с ошибкой HTTP 404.11 ( модуль фильтрации запросов настроен на запрет запрос, содержащий двойную escape-последовательность ). Прежде всего, почему он это делает? Кажется, что только выдает ошибку, если она является частью URL, но не как часть строки запроса (/ передача? Q = a + b + c работает нормально).
Теперь я мог включить двойные запросы на экранирование в разделе безопасности моего web.config, но я не решаюсь это сделать, так как не понимаю последствий, а также почему сервер не отклонит запрос «a + b + c» как часть URL, но принять как часть строки запроса.
Может кто-нибудь объяснить и дать совет, что делать?
источник
/search/a%2520b%2520c
разметку, которая привела к прекрасной ошибке «Потенциально опасное значение Request.Path было обнаружено из клиента (%)». Вы не можете выиграть, кажется.Ответы:
Изменить: Добавлен акцент на соответствующие разделы.
В основном: IIS чрезмерно параноидален. Вы можете безопасно отключить эту проверку, если вы ничего не делаете особенно неразумно с декодированными URI-данными (например, генерируете локальные URI файловой системы с помощью конкатенации строк).
Чтобы отключить проверку, сделайте следующее ( отсюда ): (см. Мой комментарий ниже, что влечет за собой двойное экранирование).
Если символ плюса является допустимым символом в поисковом вводе, вам нужно включить «allowDoubleEscaping», чтобы IIS мог обрабатывать такой ввод из пути URI.
Наконец, очень простой, но ограниченный обходной путь - просто избежать «+» и использовать вместо него «% 20». В любом случае, использование символа «+» для кодирования пробела является недопустимым кодированием URL , но характерно для ограниченного набора протоколов и, вероятно, широко поддерживается в целях обратной совместимости. Если только для целей канонизации, вам все равно лучше кодировать пробелы как «% 20»; и это приятно обходит проблему IIS7 (которая все еще может возникать для других последовательностей, таких как% 25ab.)
источник
Я просто хотел бы добавить некоторую информацию к ответу Иамона Нербонна, касающуюся части « что делать » в вашем вопросе (без объяснения причин).
Вы также можете легко изменить настройки конкретного приложения с
введите следующее (взято здесь: http://blogs.iis.net/thomad/archive/2007/12/17/iis7-rejecting-urls-conisting.aspx ):
(например , вы можете заменить
YOURSITENAME
сDefault Web Site
для применения этого правила сайта по умолчанию)Пример:
источник
Задумывались ли вы о поисковом URL-адресе, например «/ search / a / b / c»?
Вам нужно настроить маршрут как
А затем извлеките значения поиска из строки пути в действии.
HTHs
Charles
источник
Я столкнулся с этим в IIS 7.5, выполняя Server.TransferRequest () в приложении.
Кодирование имени файла вызвало проблему двойного выхода, но если я не закодировал его, я столкнулся бы с ошибкой «потенциально опасный Request.Path» .
Помещение любого протокола, даже пустого, в URL, который я передаю Server.TranferRequest (), устранил проблему.
Не работает:
Работает:
источник