Sdílet prostřednictvím


Ověření požadavku – obrana před skriptovými útoky

Tento dokument popisuje funkci ověření požadavků ASP.NET, kde je aplikace ve výchozím nastavení zabráněna ve zpracování nekódovaného obsahu HTML odeslaného na server. Tuto funkci ověření žádosti lze zakázat, pokud je aplikace navržená tak, aby bezpečně zpracovávala data HTML.

Platí pro ASP.NET 1.1 a ASP.NET 2.0.

Ověření požadavku, funkce ASP.NET od verze 1.1, brání serveru v přijetí obsahu obsahujícího nezakódovaný kód HTML. Tato funkce je navržená tak, aby zabránila některým útokům injektáže skriptů, které umožňují neúmyslně odeslat kód klientského skriptu nebo html na server, uložit a pak je prezentovat ostatním uživatelům. Přesto důrazně doporučujeme, abyste v případě potřeby ověřili všechna vstupní data a kód html je zakódujte.

Můžete například vytvořit webovou stránku, která požaduje e-mailovou adresu uživatele a pak tuto e-mailovou adresu uloží do databáze. Pokud uživatel místo platné e-mailové adresy zadá <script>alert("hello from script")</SCRIPT> , může se při zobrazení těchto dat tento skript spustit, pokud obsah nebyl správně zakódován. Funkce ověření požadavku ASP.NET tomu brání.

Proč je tato funkce užitečná

Mnoho webů si neuvědomuje, že jsou otevřené jednoduchým útokům injektáže skriptů. Ať už je účelem těchto útoků zneužovat web zobrazením HTML nebo potenciálně spustit klientský skript, který uživatele přesměruje na web hackera, útoky prostřednictvím injektáže skriptů jsou problémem, se kterým se musí vývojáři webu potýkat.

Útoky prostřednictvím injektáže skriptů se týkají všech webových vývojářů bez ohledu na to, jestli používají ASP.NET, ASP nebo jiné technologie vývoje pro web.

Funkce ověřování požadavků ASP.NET proaktivně zabraňuje těmto útokům tím, že neumožňuje, aby server zpracovával nekódovaný obsah HTML, pokud se vývojář nerozhodne tento obsah povolit.

Co očekávat: Chybová stránka

Na následujícím snímku obrazovky je ukázka kódu ASP.NET:

Snímek obrazovky znázorňující ukázku kódu ASP.NET

Spuštěním tohoto kódu vytvoříte jednoduchou stránku, která vám umožní zadat text do textového pole, kliknout na tlačítko a zobrazit text v ovládacím prvku popisek:

Snímek obrazovky znázorňující spuštění tohoto kódu má za následek jednoduchou stránku, která umožňuje zadat nějaký text do textového pole, kliknout na tlačítko a zobrazit text v ovládacím prvku Popisek.

Při zadání a odeslání JavaScriptu <script>alert("hello!")</script> by ale došlo k výjimce:

Při zadání a odeslání JavaScriptu dojde k výjimce.

Chybová zpráva uvádí, že byla zjištěna potenciálně nebezpečná hodnota Request.Form, a poskytuje další podrobnosti v popisu, co přesně se stalo a jak změnit chování. Příklad:

Ověření požadavku zjistilo potenciálně nebezpečnou vstupní hodnotu klienta a zpracování požadavku bylo přerušeno. Tato hodnota může znamenat pokus o ohrožení zabezpečení vaší aplikace, například útok skriptování mezi weby. Ověření požadavku můžete zakázat nastavením validateRequest=false v direktivě Page nebo v části konfigurace. Důrazně však doporučujeme, aby aplikace v tomto případě explicitně zkontrolovala všechny vstupy.

Zakázání ověření požadavku na stránce

Pokud chcete zakázat ověřování požadavků na stránce, musíte nastavit validateRequest atribut direktivy Page na false:

<%@ Page validateRequest="false" %>

Upozornění

Když je ověření požadavku zakázáno, obsah může být odeslán na stránku; je zodpovědností vývojáře stránky zajistit, aby byl obsah správně zakódován nebo zpracován.

Zakázání ověření žádosti pro vaši aplikaci

Pokud chcete pro aplikaci zakázat ověření požadavku, musíte pro aplikaci upravit nebo vytvořit soubor Web.config a nastavit atribut validateRequest oddílu <pages /> na falsehodnotu :

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

Pokud chcete zakázat ověřování žádostí pro všechny aplikace na vašem serveru, můžete tuto změnu provést v souboru Machine.config.

Upozornění

Pokud je ověření požadavku zakázané, může být obsah odeslán do vaší aplikace. je zodpovědností vývojáře aplikace zajistit, aby byl obsah správně zakódován nebo zpracován.

Následující kód se upraví tak, aby vypnul ověřování požadavků:

Snímek obrazovky s následujícím kódem je upravený tak, aby vypnul ověřování požadavků.

Pokud byste teď do textového pole <script>alert("hello!")</script> zadali následující JavaScript, výsledek by byl:

Snímek obrazovky, který ukazuje, jestli byl JavaScript zadán do textového pole: výsledkem bude tlačítko

Abychom tomu zabránili, musíme s vypnutým ověřováním požadavků kódovat obsah ve formátu HTML.

Kódování obsahu html

Pokud jste zakázali ověřování požadavků, je vhodné kódovat obsah html, který se uloží pro budoucí použití. Kódování HTML automaticky nahradí všechny "<' nebo '>' (spolu s několika dalšími symboly) jejich odpovídající reprezentaci kódovanou v HTML. Například "<' se nahradí "<" a ">" nahradí ">". Prohlížeče používají tyto speciální kódy k zobrazení '<' nebo '>' v prohlížeči.

Obsah lze na serveru snadno zakódovat html pomocí Server.HtmlEncode(string) rozhraní API. Obsah lze také snadno dekódovat HTML, to znamená vrátit zpět na standardní HTML pomocí Server.HtmlDecode(string) metody .

Snímek obrazovky, který ukazuje, že obsah lze na serveru snadno zakódovat ve formátu HTML pomocí rozhraní API Server.HtmlEncode(string) Obsah lze také snadno dekódovat HTML, to znamená vrátit zpět na standardní HTML pomocí metody Server.HtmlDecode(string).

Výsledkem je:

Snímek obrazovky s tlačítkem