piatok 18. marca 2011

Mylné predstavy o útokoch SQL injection

Zrejme viete, že ak si vstup od používateľa nájde cestu priamo do SQL príkazu, ktorý je vykonaný v databáze, hacker môže využiť tento fakt a kompromitovať vašu webovú stránku. Typická stratégia na ochranu pred takýmito útokmi je uloženie všetkých SQL dopytov do storovaných procedúr v databáze. Väčšina ľudí si však neuvedomuje, že presunutie dopytov do storovaných procedúr nemusí nevyhnutne ponúknuť potrebnú ochranu.


Ak vaša aplikácia volá procedúry poslaním SQL reťazca do databázy, zraniteľnosť ostáva. Napríklad, predstavte si nasledujúci VBScritp používajúci ADO recordset a objekt na pripojenie k Microsoft SQL serveru:

set rs = conn.execute("usp_my_procedure " & strInput)

Ak premenná strInput obsahuje reťazec prijatý z formulára alebo reťazca, môže kompromitovať databázu. Hackerovi stačí doplniť bodkočiarku, aby mohol pridať ďalšie príkazy.

Aby ste sa vyhli tomuto problému, môžete odstrániť všetky bodkočiarky zo vstupu. Alebo, aby to bolo bezpečnejšie, môžete parametrizovať vstup, ako je to na nasledujúcom príklade:

If strInput = "" Then
strInput = " "
End If
Set cmd = Server.CreateObject("ADODB.Command")
Set cmd.ActiveConnection = conn
cmd.CommandText = "usp_my_procedure"
cmd.Parameters.Append cmd.CreateParameter("@myinput", adVarChar, adParamInput, 50, strInput)
rs.Open cmd

Na záver si dávajte pozor na databázové príkazy, ako sú SQL server execute (alebo exec), príkaz T-SQL, ktoré môžu vytvoriť bezpečnostné diery. Okrem toho aj skryté polia alebo dáta prijaté z databázy môžu zvýšiť zraniteľnosť systému, keďže hacker môže vložiť nebezpečné hodnoty aj do skrytých polí.