Szukam wszelkiego rodzaju rozwiązania, aby poprawnie uzyskać żądanie IIS, takiego jak /programming//% i http://bing.com/%, aby nie wyświetlać strony z 400 błędnymi żądaniami , ale wyświetlać niestandardową stronę błędu podobnie jak http://google.com/% i http://facebook.com/% (oczywiście tych przykładów nie ma w IIS).
Wydaje mi się, że próbowałem ustawić wszystkie odpowiednie ustawienia rejestru http.sys (AllowRestrictedChars, PercentUAllowed) na stronie http://support.microsoft.com/kb/820129, ale to nie pomogło. Ustawienie AllowRestrictedChars i niestandardowej strony 400 ma stałe adresy URL, takie jak /programming//%12, ale nie /%.
Odpowiedzi:
Jest to zablokowane bezpośrednio na poziomie jądra IIS. Jako test wyciągnąłem każdy moduł w IIS, aby nie miał nawet statycznego modułu obsługi strony i nadal wyświetlał komunikat o błędzie 400.
Nie sądzę, aby IIS mógł to obejść. Wspomniane ustawienia rejestru dotyczą innych typów znaków zastrzeżonych. Nie widziałem dźwigni do zmiany tej funkcjonalności.
Jaki jest twój cel, aby tego uniknąć? Powoduje to szersze otwarcie powierzchni ataku i nie wyobrażam sobie, aby prawdziwy użytkownik został utracony w wyniku zablokowania niekompletnych sekwencji ucieczki adresów URL.
Aktualizacja 2: Oto trzy świetne linki na ten temat. Zarówno Nazim Lala, jak i Wade Hilmo z zespołu IIS pisali o tym na blogu z powodu dyskusji wokół twojego pytania. Również Scott Hanselman ma świetny post na temat querystring w .NET:
Aktualizacja: skontaktowałem się z członkiem zespołu IIS, aby uzyskać wiarygodną odpowiedź. Wspomniał, że% jest uważany za niebezpieczny znak zgodnie z RFC 1738 ( http://www.ietf.org/rfc/rfc1738.txt ).
Oto właściwy tekst:
IIS aktywnie blokuje to na poziomie podstawowym, proaktywny środek bezpieczeństwa w celu zminimalizowania powierzchni ataku.
źródło
Mogę wymyślić 3 możliwe sposoby
Zmień usługi IIS, aby wskazywały niestandardową stronę pod kątem 400 błędów, niż zwykle
Jeśli jest to unikalne dla określonej strony internetowej w IIS, możesz zrobić coś takiego w web.config:
<customErrors defaultRedirect = "ErrorPage.aspx" mode = "On">
<error statusCode = "400" redirect = "myCustom400Error.aspx" />
</customErrors>
Napisz moduł httpModule, który sprawdza przychodzące adresy URL i obsługuje je
źródło
Jedynym sposobem na obejście tego jest sprawdzenie adresu URL, zanim jądro IIS będzie mogło.
Musisz przesłać dynamicznie generowane linki za pomocą skryptu, aby je sprawdzić przed przekazaniem użytkownika końcowego na ten adres URL ...
Poza tym wiesz, że jest to jedyna sytuacja, w której IIS nie poradzi sobie z tym tak, jak chcesz. Tak więc, poprzez proces eliminacji, jeśli masz nieobsługiwane żądanie, wiesz, co je spowodowało.
Być może sprawdzenie odsyłacza na niestandardowej stronie 400 pomogłoby zawęzić źródło ruchu?
źródło
Ten post na forum IIS wskazuje, że HTTP 400 (Bad Request) jest blokowany przez http.sys i nie trafia do IIS, który pasuje do linków, które @Scott Forsyth - MVP umieścił w swojej oryginalnej odpowiedzi.
Możesz zobaczyć dziennik tych żądań pod c: \ Windows \ System32 \ LogFiles \ HTTPERR \
Nie wiem, czy możesz skonfigurować stronę odpowiedzi, która jest odsyłana do użytkownika z powodu tego rodzaju błędu, ale ponieważ nawet Bing cierpi z powodu tego problemu, podejrzewam, że albo nie jest to możliwe, albo wymagałoby okropnych włamań systemowych.
źródło