Script-injection a ako sa brániť spigi - 10. 11. 2003 21:04 - 11215 views Zoznámime sa s problémom, ktorý sa nazýva script-injection a nejakými možnosťami ochrany našich web aplikácií. Čo to znamená script-injection Predstavte si situáciu, že máte na stránke diskusné fórum, užívatelia pridávajú svoje príspevky, Vy ich ukladáte do databázy a následne zobrazujete na stránke. Toto všetko je v poriadku, pokiaľ Vaše diskusné fórum používajú "slušní" užívatelia :-) Čo sa však stane, ak Vám užívateľ ako príspevok do fóra namiesto klasického textu vloží aj kus nejakého JavaScriptu? Ak to nemáte explicitne ošetrené, tak sa Vám do stránky dostane nevyžiadaný kód, ktorý môže byť pre koncových čitateľov Vášho fóra potenciálne nebezpečný, prinajmenšom nepríjemný. Napríklad Vám užívateľ vloží namiesto klasického textu, kus skriptu: Nepríjemné však? .NET Framework 1.1 Čiastočnu pomoc nám prináša .NET Framework 1.1, v ktorom je vloženie takéhoto skriptu primárne zakázané a pri pokuse o odoslanie na server je vyvolaná výnimka. Takto je pri štandartne zapnutom "ASP.NET 1.1 Request Validation" myslené na vývojárov, ktorí sú nepozorní a nedostatočne kontrolujú vstup od užívateľa. POZOR! Request Validation je k dispozícii iba od verzie .NET Framework 1.1! Pri starej verzii si musíte pomôcť sami „ručnou“ validáciou (čítajte ďalej). Ukážka odoslania na webserver čistého "bezpečného" textu Máme tu malý príklad. Na stránke je umiestnený textbox, tlačítko a label. V podstate žiaden problém, slovo Ahoj sa pod tlačítkom Button zobrazilo správne. Ukážka odoslania na webserver „nebezpečného“ textu spolu s JavaScriptom 1. validateRequest=“true“ (default) Po odoslaní tejto stránky sa nám vyvolá výnimka a .NET Framework pozastaví spracovanie tohto „nebezpečného“ kódu. 2. validateRequest=“false“ (default) Ako vidíme, po odoslaní "nebezpečného" skriptu a jeho následnom zobrazení v prvku Label, sa výsledný kód JavaScriptu vykoná. Toto je častá chyba web programátorov. Ako môžeme vypnúť Request Validation? Na vypnutie Request Validation na jednej stránke nám postačí nastaviť atribúť validateRequest direktívy Page na false. Ak potrebujeme vypnúť Request Validation v celej web aplikácii, tak pridáme nasledujúce nastavenie do web.config: <configuration> <system.web> <pages validateRequest="false" /> </system.web> </configuration>HTML encoding... Ak sa vrátime k nášmu diskusnému fóru, tak ak chceme do databázy uložiť tento nebezpečný kód a následne ho zobraziť na stránke ako čistý text, musíme v prvom rade vypnuť automatickú validáciu. Potom je potrebné tento vstup od užívateľa spracovať, enkódovať. V podstate ide o to, že v stringu, ktorý chceme enkódovať sa nahradia všetky nebezpečné znaky ‘<’, ‘>’ znakmi ekvivalentnými v HTML. .NET Framework nám v tomto smere opäť vyjde v ústrety a ponúka nám funckiu Server.HtmlEncode(string) a tiež reverznú funkciu Server.HtmlDecode(string). Ukážka HTML encoding Ak len predsa potrebujeme zobraziť všetko, čo bolo odoslané, použijeme HtmlEncoding.