Ověření požadavku – zabránění útokům na skripty

Tento dokument popisuje funkci ověření požadavku ASP.NET, kde ve výchozím nastavení aplikace není možné zpracovávat nekódovaný obsah HTML odeslaný na server. Tuto funkci ověření požadavku je možné zakázat, když 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 přijímat obsah obsahující kód HTML bez kódování. Tato funkce je navržená tak, aby zabránila některým útokům prostřednictvím injektáže skriptu, kdy se kód klientského skriptu nebo kód HTML můžou neúmyslně odesílat na server, ukládat a pak prezentovat jiným uživatelům. Přesto důrazně doporučujeme, abyste ověřili všechna vstupní data a kód HTML, pokud je to vhodné.

Například vytvoříte webovou stránku, která požádá o e-mailovou adresu uživatele a uloží tuto e-mailovou adresu do databáze. Pokud uživatel zadá <SCRIPT>alert("hello from script")</SCRIPT> místo platné e-mailové adresy, může se tento skript spustit, pokud nebyl obsah správně zakódován. Funkce ověření požadavku ASP.NET brání tomu, aby k tomu došlo.

Proč je tato funkce užitečná

Mnoho webů si není vědomo, že jsou otevřené pro jednoduché útoky prostřednictvím injektáže skriptů. Bez ohledu na to, jestli je účelem těchto útoků odstranit web zobrazením kódu HTML, nebo potenciálně spustit klientský skript, který přesměruje uživatele na web hackera, útoky prostřednictvím injektáže skriptů jsou problém, se kterým se musí vývojáři webu vypořádat.

Útoky prostřednictvím injektáže skriptů jsou obavy všech webových vývojářů, ať už používají ASP.NET, ASP nebo jiné technologie vývoje webu.

Funkce ověření požadavku ASP.NET aktivně brání těmto útokům tím, že neumožňuje zpracování nekódovaného obsahu HTML serverem, pokud se vývojář nerozhodne povolit tento obsah.

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

Na následujícím snímku obrazovky je několik ukázkových ASP.NET kódu:

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

Spuštěním tohoto kódu se zobrazí jednoduchá stránka, která umožňuje zadat do textového pole nějaký text, kliknout na tlačítko a zobrazit text v ovládacím prvku popisek:

Snímek obrazovky, který ukazuje, že spuštěním tohoto kódu vznikne jednoduchá stránka, umožňující zadat nějaký text do textového pole, kliknout na tlačítko a zobrazit text v popisku.

Pokud by byl zadán a odeslán JavaScript, například <script>alert("hello!")</script>, získali bychom výjimku.

Pokud je JavaScript zadán a odeslán, jeden by získal výjimku.

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í. Napří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 direktivy Page nebo v konfigurační části. Důrazně však doporučujeme, aby vaše aplikace v tomto případě explicitně zkontrolovala všechny vstupy.

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

Chcete-li zakázat ověření požadavku na stránce, musíte nastavit validateRequest atribut direktivy Page na false:

<%@ Page validateRequest="false" %>

Upozornění

Pokud je ověření požadavku zakázané, lze obsah odeslat na stránku. Na vývojářovi stránky je zodpovědnost zajistit, že obsah je správně kódován nebo zpracován.

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

Chcete-li zakázat ověření požadavku pro vaši aplikaci, musíte upravit nebo vytvořit soubor Web.config pro vaši aplikaci a nastavit atribut validateRequest oddílu <pages /> na false:

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

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

Upozornění

Pokud je ověřování požadavků zakázáno, obsah může být do aplikace odeslán; vývojář aplikace je zodpovědný za správné kódování nebo zpracování tohoto obsahu.

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

Snímek obrazovky znázorňující níže uvedený kód se upraví, aby se vypnulo ověření žádosti.

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

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

Abychom tomu zabránili, musíme obsah kódovat kódem HTML, protože je vypnuté ověření požadavku.

Kódování obsahu HTML

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

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

Snímek obrazovky, který ukazuje, že obsah lze snadno kódovat html na serveru pomocí rozhraní API Server.HtmlEncode(string). Obsah lze také snadno dekódovat HTML, tj. vrátit zpět ke standardnímu HTML pomocí Metody Server.HtmlDecode(string).

Výsledkem je:

Snímek obrazovky znázorňující tlačítko