Является Ли Включение Двойного Побега Опасным?



У меня есть 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-адреса, но примет как часть строки запроса.



может кто-нибудь объяснить и дать совет, что делать?

637   4  

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 это связанные с "что делать" часть вашего вопроса (не объясняя почему).
Вы можете легко изменить настройки конкретного приложения тоже с

  1. открыв консоль С правами администратора (пуск-cmd-щелкните правой кнопкой мыши, Запуск от имени администратора)
  2. ввести следующее (взято отсюда: 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 для применения этого правила к веб-сайту по умолчанию)

  3. ввод, готово.

пример:

  1. во-первых у меня была такая же проблема: HTTP Error 404.11 - The request filtering module is configured to deny a request that contains a double escape sequence.
  2. ввод текста, упомянутого выше: Drupal7-anotherSolution to HTTP Error 404.11 - The request filtering module is configured to deny a request that contains a double escape sequence.
  3. теперь это работает как и ожидалось: Solution to HTTP Error 404.11 - The request filtering module is configured to deny a request that contains a double escape sequence.

я столкнулся с этим в IIS 7.5, делая сервер.TransferRequest() в приложении.

кодирование имени файла вызвало проблему двойного побега, но если бы я не кодировал его, то я бы столкнулся с "потенциально опасный запрос.Путь" ошибка.

помещая любой протокол, даже пустой, на URL, который я передаю серверу.TranferRequest () Исправлена проблема.

не работает:

context.Server.TransferRequest("/application_name/folder/bar%20bar.jpg");

работает:

context.Server.TransferRequest("://folder/bar%20bar.jpg");

Comments

    Ничего не найдено.