Żądanie walidacji — zapobieganie atakom za pomocą skryptów

W tym dokumencie opisano funkcję walidacji żądania ASP.NET, gdzie Domyślnie aplikacja nie może przetwarzać niekodowanej zawartości HTML przesłanej do serwera. Tę funkcję sprawdzania poprawności żądania można wyłączyć, gdy aplikacja została zaprojektowana w celu bezpiecznego przetworzenia danych HTML.

Dotyczy ASP.NET 1,1 i ASP.NET 2,0.

Zażądaj zweryfikowania funkcji ASP.NET od wersji 1,1, uniemożliwiając serwerowi akceptowanie zawartości zawierającej niezakodowany kod HTML. Ta funkcja została zaprojektowana w taki sposób, aby zapobiec atakom polegającym na wstrzyknięciu skryptów, zgodnie z którymi kod skryptu klienta lub HTML może być nieświadomie przesłany do serwera, przechowywany i przedstawiony innym użytkownikom. Zdecydowanie zalecamy, aby sprawdzać poprawność wszystkich danych wejściowych i kodu HTML w razie potrzeby.

Można na przykład utworzyć stronę sieci Web, która żąda adresu e-mail użytkownika, a następnie przechowywać ten adres e-mail w bazie danych. Jeśli użytkownik wprowadzi <skrypt>alertu ("Hello from Script")</SCRIPT> zamiast poprawnego adresu e-mail, po wyświetleniu tych danych ten skrypt można wykonać, jeśli zawartość nie została prawidłowo zaszyfrowana. Funkcja walidacji żądania ASP.NET zapobiega tym samym.

Dlaczego ta funkcja jest przydatna

W wielu lokacjach nie ma informacji, że są one otwarte dla prostych ataków na wstrzyknięcie skryptu. Bez względu na to, czy celem tego ataku jest odtworzenie witryny przez wyświetlanie kodu HTML lub potencjalnie wykonanie skryptu klienta w celu przekierowania użytkownika do lokacji hakera, ataki przed iniekcją skryptów są problemem, który deweloperzy sieci Web muszą będą konkurować o.

Ataki z iniekcją skryptów to zainteresowania wszystkich deweloperów sieci Web, niezależnie od tego, czy korzystają z ASP.NET, ASP, czy innych technologii programistycznych dla sieci Web.

Funkcja walidacji żądań ASP.NET pozwala aktywnie zapobiegać atakom, nie zezwalając na przetworzenie niezakodowanej zawartości HTML na serwerze, chyba że deweloper zdecyduje się zezwolić na tę zawartość.

Oczekiwane: Strona błędu

Poniższy zrzut ekranu przedstawia przykładowy kod ASP.NET:

Uruchomienie tego kodu powoduje prostą stronę, która umożliwia wprowadzanie tekstu w polu tekstowym, a następnie kliknięcie tego przycisku i wyświetlenie tekstu w kontrolce etykieta:

Jednak były to skrypty JavaScript, takie jak <script>alert("hello!")</script>, które mają zostać wprowadzone i przesłane, możemy uzyskać wyjątek:

Komunikat o błędzie stwierdza, że wykryto wartość "potencjalnie niebezpieczne żądanie. formularz" i zawiera więcej szczegółów w opisie, jak dokładnie to, co się stało, i jak zmienić zachowanie. Na przykład:

Podczas sprawdzania poprawności żądania wykryto potencjalnie niebezpieczną wartość wejściową klienta i przetwarzanie żądania zostało przerwane. Ta wartość może wskazywać na próbę złamania zabezpieczeń aplikacji, na przykład atak skryptowy między lokacjami. Sprawdzanie poprawności żądania można wyłączyć, ustawiając validateRequest=false w dyrektywie page lub w sekcji konfiguracji. Jednak zdecydowanie zaleca się, aby aplikacja jawnie sprawdzał wszystkie dane wejściowe w tym przypadku.

Wyłączanie weryfikacji żądań na stronie

Aby wyłączyć weryfikację żądań na stronie, należy ustawić atrybut validateRequest dyrektywy Page na false:

<%@ Page validateRequest="false" %>

Caution

Po wyłączeniu walidacji żądania można przesłać zawartość na stronę; Projektant strony jest odpowiedzialny za zapewnienie, że zawartość jest prawidłowo zaszyfrowana lub przetworzona.

Wyłączanie weryfikacji żądań dla aplikacji

Aby wyłączyć weryfikację żądań dla aplikacji, należy zmodyfikować lub utworzyć plik Web. config dla aplikacji i ustawić atrybut validateRequest sekcji <pages />, aby false:

<configuration>
   <system.web>
      <pages validateRequest="false" />
   </system.web>
</configuration>

Jeśli chcesz wyłączyć weryfikację żądań dla wszystkich aplikacji na serwerze, możesz wprowadzić tę modyfikację do pliku Machine. config.

Caution

Gdy weryfikacja żądania jest wyłączona, zawartość może zostać przesłana do aplikacji; Deweloper aplikacji jest odpowiedzialny za zapewnienie, że zawartość jest prawidłowo zakodowana lub przetwarzana.

Poniższy kod został zmodyfikowany, aby wyłączyć weryfikację żądania:

Teraz, jeśli Poniższy kod JavaScript został wprowadzony do pola tekstowego <script>alert("hello!")</script> wynik:

Aby temu zapobiec, z wyłączeniem walidacji żądania, musimy zakodować zawartość HTML.

Jak kodować zawartość HTML

Jeśli wyłączono weryfikację żądań, dobrym sposobem jest kodowanie HTML zawartości, która będzie przechowywana do użytku w przyszłości. Kodowanie HTML automatycznie zastępuje wszystkie "<" lub ">" (wraz z innymi innymi symbolami) z odpowiadającą im reprezentacją zakodowaną w kodzie HTML. Na przykład element "<" jest zastępowany przez element "&lt;" i ">" został zastąpiony przez "&gt;". Przeglądarki używają tych specjalnych kodów do wyświetlania "<" lub ">" w przeglądarce.

Zawartość można łatwo zakodować HTML na serwerze za pomocą interfejsu API Server.HtmlEncode(string). Zawartość można również łatwo zdekodować HTML, czyli przywrócić ją z powrotem do standardowego kodu HTML przy użyciu metody Server.HtmlDecode(string).

Wyniki: