Správičky 2 270 Blogy 577 Fórum 14 074

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.




Ing. Igor Stanek, ASP.NET MVP, MCP

Som spoluzakladateľom a spolumajiteľom spoločnosti CHASTIA s.r.o., Poprad (www.chastia.com). V spoločnosti pôsobím ako konateľ a Software Architect.

Prevádzkujem internetový portál na online prevod jednotiek na internete www.prevody.sk a prvý internetový portál o technológii Microsoft .NET na Slovensku www.vyvojari.sk (bývalé www.AspNet.sk).

Som držiteľom certifikácie Microsoft Certified Professional a zo strany Microsoftu som už 6 rokov za sebou ocenený titulom Microsoft Most Valuable Professional za kompetenciu "ASP.NET/IIS".

Ďalšie info o mne nájdete na mojej osobnej stránke www.spigi.sk.

Článkov: 105, Správičiek: 13, Príspevkov vo fóre: 560, Príspevkov v blogu: 124, Bodov: 15560
Najaktívnejší č.: 3
Profil používateľa

Reakcie

# RE: Script-injection a ako sa brániť 19. 7. 2005 1:02:18 EX

tak toto je presne to co som mal na srdci, uplna parada, krasne rozobrata problematika :)

Titulok:


Meno:


Url:
Koľko je 22 + 4? (ochrana proti spamu)

Komentár:


Najaktívnejší užívatelia
1. 35110 b. photo vlko
2. 16735 b. photo T
3. 15560 b. photo spigi
4. 6635 b. photo dudok
5. 5705 b. photo slavof
6. 5205 b. photo siro
7. 4745 b. photo duracellko
8. 3780 b. photo Liero
9. 3690 b. photo lubolacko
10. 3625 b. photo jakub