Zabezpečíme přístup do databáze tak, aby nedocházelo ke zneužití pomocí SQL příkazů. Zdrojové kódy uvedené v minulém článku neobsahují kontrolu vstupních dat. V případě, že někdo do vstupních polí zadá znak „;“ (středník) a poté nějaký SQL příkaz, například „DROP TABLE Admin“, tento příkaz se provede. A jak tuto bezpečnostní chybu odstranit?

Funkce CropSQLSpecialChars

Nejjednodušší a nejúčelnější způsob je odfiltrovat speciální SQL znaky pomocí standardních funkcí VBScriptu – Replace. Funkce Replace bude nahrazovat speciální znaky HTML entitami, což znamená, že znaky budou v databázi uloženy „zakódované“, ale v prohlížeči se budou zobrazovat zcela normálně.

Speciální znak HTML entita
#039;
vbCrLf <br>
* #042;
; #059;

  <%
  Function CropSQLSpecialChars(ByVal Text)
    Dim strTemp
    ‚deklarace proměnných
    strTemp = Text
    ‚načtení vstupních dat

    strTemp = Replace(strTemp, „‚“, „'“)
    strTemp = Replace(strTemp, vbCrLf, „<br>“)
    strTemp = Replace(strTemp, „*“, „*“)
    strTemp = Replace(strTemp, „;“, „;“)
    ‚nahrazení speciálních znaků entitami / tagy
    CropSQLSpecialChars = strTemp
    ‚zapsání návratové hodnoty
    End Function
  %>

Filtrování dat pomocí funkce CropSQLSpecialChars

Funkci CropSQLSpecialChars použijeme na každém místě, kde manipulujeme s proměnnými, jejichž hodnoty získáváme z formuláře či z řetězce QueryString. Upravený kód bude vypadat takto (upravená část zdrojového kódu z minulého článku):

  Původní kód:
  …
  Case 4
  ‚upravit kategorii
  If Len(Request.Form(„submit“)) > 0 Then
  ‚v případě, že formulář byl odeslán
    intNadrazena = CInt(Request.Form(„nadrazena“))
    strNazev = Request.Form(„nazev“))
    strPopis = Request.Form(„popis“))
    intId = CInt(Request.Form(„id“))
    ‚načti hodnoty z formuláře a filtrování speciálních znaků
    PripojDatabazi
  …
  Upravený kód:
  …
  Case 4
  ‚upravit kategorii
  If Len(Request.Form(„submit“)) > 0 Then
  ‚v případě, že formulář byl odeslán
    intNadrazena = CInt(Request.Form(„nadrazena“))
    strNazev = CropSQLSpecialChars(Request.Form(„nazev“))
    strPopis = CropSQLSpecialChars(Request.Form(„popis“))
    intId = CInt(Request.Form(„id“))
    ‚načti hodnoty z formuláře a filtrování speciálních znaků
    PripojDatabazi
  …

Kód funkce vložíme navrch každého souboru, ve kterém načítáme data z formulářů (hlavně admin.asp, prihlasit.asp a další).

Další možnosti zabezpečení

Další možností, jak administrační systém zabezpečit, je důkladně filtrovat vstupní data pomocí konverzních funkcí VBScriptu CInt, CLong, CBool, CDate a dalších. Potenciální nebezpečí hrozí hlavně v řetězcích. Číselné či logické hodnoty nemohou být zneužity. Před samotnou konverzí datových typů je dobré ověřit, zda lze konverzi provést či zda se má nastavit implicitní hodnota.

  Původní kód:
  …
  Case 4
  ‚upravit kategorii
  If Len(Request.Form(„submit“)) > 0 Then
  ‚v případě, že formulář byl odeslán
    intNadrazena = CInt(Request.Form(„nadrazena“))
    strNazev = Request.Form(„nazev“))
    strPopis = Request.Form(„popis“))
    intId = CInt(Request.Form(„id“))
    ‚načti hodnoty z formuláře a filtrování speciálních znaků
    PripojDatabazi
  …
  Upravený kód:
  …
  Case 4
  ‚upravit kategorii
  If Len(Request.Form(„submit“)) > 0 Then
  ‚v případě, že formulář byl odeslán
    If IsNumeric(Request.Form(„nadrazena“)) Then intNadrazena = CInt(Request.Form(„nadrazena“)) Else intNadrazena = 0
    strNazev = CropSQLSpecialChars(Request.Form(„nazev“))
    strPopis = CropSQLSpecialChars(Request.Form(„popis“))
    If IsNumeric(Request.Form(„id“)) Then intId = CInt(Request.Form(„id“)) Else Err.Raise 10001, „Chyba“, „Chyba při konverzi datových typů!“
    ‚načti hodnoty z formuláře a filtrování speciálních znaků, konvertuj datové typy, popř. vygeneruj chybu
    PripojDatabazi
  …

Dnes jsme si ukázali, jak zvýšit bezpečnost našeho elektronického obchodu filtrováním vstupních dat tak, aby nemohly být spuštěny nechtěné SQL příkazy. Zabezpečení systému tímto nemusí být kompletní, ale mělo by být dostačující pro reálný provoz. Příště vytvoříme a integrujeme do stávajícího e-shopu databázi uživatelů, aby nemuseli při každém nákupu zadávat osobní data.

Pozn. red.: Seriál musel být předčasně ukončen, protože autor nedodal slíbená pokračování. Máte-li zájem v seriálu pokračovat vlastními články, prosíme, kontaktujte redakci.

Starší komentáře ke článku

Pokud máte zájem o starší komentáře k tomuto článku, naleznete je zde.

Žádný příspěvek v diskuzi

Odpovědět