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

W tym dokumencie opisano funkcję weryfikacji żądań ASP.NET, w której domyślnie aplikacja nie może przetwarzać niezakodowanej zawartości HTML przesłanej do serwera. Tę funkcję weryfikacji żądania można wyłączyć, gdy aplikacja została zaprojektowana do bezpiecznego przetwarzania danych HTML.

Dotyczy ASP.NET 1.1 i ASP.NET 2.0.

Walidacja żądania, funkcja ASP.NET od wersji 1.1, uniemożliwia serwerowi akceptowanie zawartości zawierającej niekodowany kod HTML. Ta funkcja została zaprojektowana w celu zapobiegania atakom polegającym na wstrzyknięciu skryptów, w których kod skryptu klienta lub kod HTML mogą być nieświadomie przesyłane do serwera, przechowywane, a następnie prezentowane innym użytkownikom. Nadal zdecydowanie zalecamy zweryfikowanie wszystkich danych wejściowych i kodowanie HTML, gdy jest to konieczne.

Na przykład tworzysz stronę sieci Web, która żąda adresu e-mail użytkownika, a następnie przechowuje ten adres e-mail w bazie danych. Jeśli użytkownik wprowadzi <alert SCRIPT>("hello from script")</SCRIPT> zamiast prawidłowego adresu e-mail, po wyświetleniu tych danych ten skrypt może zostać wykonany, jeśli zawartość nie została prawidłowo zakodowana. Funkcja weryfikacji żądania ASP.NET zapobiega temu.

Dlaczego ta funkcja jest przydatna

Wiele witryn nie jest świadomych, że są otwarte na proste ataki iniekcji skryptu. Niezależnie od tego, czy celem tych ataków jest usunięcie witryny przez wyświetlenie kodu HTML, czy potencjalnie wykonanie skryptu klienta w celu przekierowania użytkownika do witryny hakera, ataki iniekcji skryptu są problemem, z którym muszą zmagać się deweloperzy sieci Web.

Ataki iniekcji skryptów dotyczą wszystkich deweloperów internetowych, niezależnie od tego, czy korzystają z ASP.NET, ASP, czy innych technologii tworzenia aplikacji internetowych.

Funkcja weryfikacji żądania ASP.NET aktywnie zapobiega atakom, nie zezwalając na przetwarzanie niezakodowanej zawartości HTML przez serwer, chyba że deweloper zdecyduje się zezwolić na tę zawartość.

Czego można oczekiwać: strona błędu

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

Zrzut ekranu przedstawiający przykład kodu ASP.NET.

Uruchomienie tego kodu powoduje wyświetlenie prostej strony, która pozwala wprowadzić jakiś tekst w polu tekstowym, kliknąć przycisk i wyświetlić tekst w kontrolce etykiety:

Zrzut ekranu przedstawiający uruchamianie tego kodu powoduje wyświetlenie prostej strony, która umożliwia wprowadzenie tekstu w polu tekstowym, kliknięcie przycisku i wyświetlenie tekstu w kontrolce etykiety.

Jednak gdyby język JavaScript został <script>alert("hello!")</script> wprowadzony i przesłany, otrzymalibyśmy wyjątek:

Jeśli język JavaScript zostanie wprowadzony i przesłany, zostanie wyświetlony wyjątek.

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

Walidacja żądania wykryła potencjalnie niebezpieczną wartość wejściową klienta, a przetwarzanie żądania zostało przerwane. Ta wartość może wskazywać na próbę naruszenia zabezpieczeń aplikacji, takich jak atak skryptowy między witrynami. Walidację żądań można wyłączyć, ustawiając validateRequest=false w dyrektywie Page lub w sekcji konfiguracji. Jednak zdecydowanie zaleca się, aby aplikacja jawnie sprawdziła wszystkie dane wejściowe w tym przypadku.

Wyłączanie walidacji żądania na stronie

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

<%@ Page validateRequest="false" %>

Przestroga

Gdy walidacja żądania jest wyłączona, zawartość można przesłać do strony; Jest to odpowiedzialność dewelopera strony, aby upewnić się, że zawartość jest prawidłowo zakodowana lub przetworzona.

Wyłączanie weryfikacji żądania dla aplikacji

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

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

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

Przestroga

Gdy walidacja żądania jest wyłączona, zawartość można przesłać do aplikacji; Jest to odpowiedzialność dewelopera aplikacji, aby upewnić się, że zawartość jest prawidłowo zakodowana lub przetwarzana.

Poniższy kod jest modyfikowany w celu wyłączenia weryfikacji żądania:

Zrzut ekranu przedstawiający poniższy kod został zmodyfikowany w celu wyłączenia weryfikacji żądania.

Teraz, jeśli następujący kod JavaScript został wprowadzony w polu tekstowym <script>alert("hello!")</script> , wynik będzie następujący:

Zrzut ekranu pokazujący, czy język JavaScript został wprowadzony w polu tekstowym: wynikiem będzie przycisk

Aby temu zapobiec, gdy walidacja żądania jest wyłączona, musimy zakodować zawartość w kodzie HTML.

Jak kodować zawartość w języku HTML

Jeśli wyłączono walidację żądania, dobrym rozwiązaniem jest kodowanie zawartości HTML, która będzie przechowywana w przyszłości. Kodowanie HTML automatycznie zastąpi wszystkie symbole "<" lub ">" (razem z kilkoma innymi symbolami) odpowiednią reprezentacją zakodowaną w formacie HTML. Na przykład wyrażenie "<" zostało zastąpione ciągami "<", a wyrażenie ">" zostało zastąpione wyrazem ">". Przeglądarki używają tych specjalnych kodów do wyświetlania znaku "<" lub ">" w przeglądarce.

Zawartość może być łatwo zakodowana w formacie HTML na serwerze przy użyciu interfejsu Server.HtmlEncode(string) API. Zawartość może być również łatwo zdekodowana w formacie HTML, czyli przywracana do standardowego Server.HtmlDecode(string) kodu HTML przy użyciu metody .

Zrzut ekranu przedstawiający zawartość może być łatwo zakodowany w formacie HTML na serwerze przy użyciu interfejsu API Server.HtmlEncode(string). Zawartość może być również łatwo zdekodowana w formacie HTML, czyli przywracana do standardowego kodu HTML przy użyciu metody Server.HtmlDecode(string).

Wynikowe:

Zrzut ekranu przedstawiający przycisk