Является Ли Включение Двойного Побега Опасным?
У меня есть ASP.NET приложение MVC с маршрутом, который позволяет искать материал через /search / .
когда я предоставляю "поиск / abc", он работает хорошо, но когда я предоставляю "/ search/a+b+c " (правильно закодированный url), то IIS7 отклоняет запрос с ошибкой HTTP 404.11 (модуль фильтрации запросов настроен на отклонение запроса, содержащего двойную escape-последовательность). Прежде всего, почему он это делает? Это только кажется, чтобы бросить ошибку, если она является частью URL, но не как часть строки запроса (/transmit?q=a+b+c работает отлично).
теперь я могу включить двойные запросы escape в разделе безопасности моего веб-сайта.но я не решаюсь сделать это, поскольку я не понимаю последствий, и ни почему сервер отклонит запрос "a+b+c" как часть URL-адреса, но примет как часть строки запроса.
может кто-нибудь объяснить и дать совет, что делать?
4 ответов:
Edit: добавлен акцент на соответствующие разделы.
в основном: IIS является чрезмерно параноидальным. Вы можете безопасно отключить эту проверку, если вы не делаете ничего особенно неразумного с декодированными данными uri (например, генерируя локальные URI файловой системы через конкатенацию строк).
отключить проверку выполните следующие действия (с здесь): (см. Мой комментарий ниже для того, что двойное преобразование влечь за собой.)
<system.webServer> <security> <requestFiltering allowDoubleEscaping="true"/> </security> </system.webServer>Если символ плюс является допустимым символом в поисковом вводе, вы будете нужно чтобы включить "allowDoubleEscaping", чтобы разрешить IIS обрабатывать такие входные данные из пути URI.
наконец, очень простой, если ограниченный обходной путь - это просто избежать " + "и использовать" %20 " вместо этого. в любом случае, использование символа '+' для кодирования пробела равно не допустимая кодировка url, но характерные для ограниченного набора протоколов и вероятно, широко поддерживается по причинам обратной совместимости. Если только для целей канонизации, вам лучше кодировать пробелы как "%20 " в любом случае; и это хорошо обходит проблему IIS7 (которая все еще может возникнуть для других последовательностей, таких как %25ab.)
вы думали о том, чтобы найти URL, как '/ search/a/b / c'?
вам нужно будет настроить маршрут, как
search/{*path}а затем извлеките значения поиска из строки пути в действии.
HTHs
Чарльз
Я просто хотел бы добавить информацию Имон Nerbonne это связанные с "что делать" часть вашего вопроса (не объясняя почему).
Вы можете легко изменить настройки конкретного приложения тоже с
- открыв консоль С правами администратора (пуск-cmd-щелкните правой кнопкой мыши, Запуск от имени администратора)
ввести следующее (взято отсюда: http://blogs.iis.net/thomad/archive/2007/12/17/iis7-rejecting-urls-containing.aspx):
%windir%\system32\inetsrv\appcmd set config "YOURSITENAME" -section:system.webServer/security/requestfiltering -allowDoubleEscaping:true(вы можете, например, заменить
YOURSITENAMEСDefault Web Siteдля применения этого правила к веб-сайту по умолчанию)- ввод, готово.
пример:
я столкнулся с этим в IIS 7.5, делая сервер.TransferRequest() в приложении.
кодирование имени файла вызвало проблему двойного побега, но если бы я не кодировал его, то я бы столкнулся с "потенциально опасный запрос.Путь" ошибка.
помещая любой протокол, даже пустой, на URL, который я передаю серверу.TranferRequest () Исправлена проблема.
не работает:
context.Server.TransferRequest("/application_name/folder/bar%20bar.jpg");работает:
context.Server.TransferRequest("://folder/bar%20bar.jpg");



Comments