Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

6. diel - SqlDataReader a pripojená databáza vo VB.NET

V predchádzajúcom kvíze, Kvíz - Databáza, prístupy, pripojená aplikácia vo VB-ADO.NET, sme si overili nadobudnuté skúsenosti z predchádzajúcich lekcií.

V dnešnom Databáze - ADO.NET tutoriále, v jazyku VB.NET, sa naučíme čítať riadky z databázy pomocou triedy SqlDataReader a používať parametrizované otázky, ktoré znemožňujú útok SQL injection.

Pracujeme s databázou z lekcie Vytvorenie lokálnej databázy vo Visual Studio vo VB.NET, ktorú v jednotlivých lekciách upravujeme.

Čítanie dát

Ak potrebujeme spustiť nad databázou dotaz, ktorý vracia viac záznamov (ten náš posledný vracal len jedno číslo) musíme na spracovanie výsledku dotazu využiť triedu SqlDataReader. Inštanciu tejto triedy, ako výsledok, vráti metóda ExecuteReader() triedy SqlCommand.

Trieda SqlDataReader umožňuje prechádzať výslednú množinu dát po jednotlivých záznamoch. Na to slúži metóda Read(). Prístup k jednotlivým atribútom záznamu môžeme získať pomocou indexu alebo názvu stĺpca uvedeného v okrúhlych zátvorkách.

Výpis slovíčok

Napíšeme si kód na vypísanie všetkých slovíčok z našej databázy:

Using pripojeni As SqlConnection = New SqlConnection(connectionString)
    pripojeni.Open()
    Dim prikaz As SqlCommand = New SqlCommand("SELECT Id, Czech, English FROM Word", pripojeni)
    Dim dataReader As SqlDataReader = prikaz.ExecuteReader()
    While dataReader.Read()     ' kým neprejdeme všetky záznamy
        Console.WriteLine("{0} {1} {2}",
                dataReader(0),
                dataReader("Czech"),
                dataReader(2))
    End While
    pripojeni.Close()
End Using

Pripojíme sa k databáze metódou Open() a do premennej prikaz zostavíme SQL dotaz. V cykle While, na inštancii dataReader typu SqlDataReader, postupne načítavame slovíčka metódou Read() a vypisujeme pre každý stĺpec jeho:

  • index (Id) dataReader(0),
  • názov dataReader("Czech"),
  • index (English) dataReader(2).
Výsledok:
Konzolová aplikácia
1 počítač computer
2 míč ball
3 pes dog
4 já I
5 mít rád like
6 devbook devbook

Odovzdávanie parametrov

Urobme z aplikácie skutočný slovníček:-) a nechajme užívateľa zadať slovíčko, ktoré mu následne preložíme.

SQL injekcia

Najprv si ukážme, ako sa to nemá robiť. Naivne by sme si mohli nechať zadať slovíčko a to potom priamo vložiť ako vyhľadávanú frázu do dotazu. Zdrojový kód aplikácie by vyzeral takto:

' Tento zdrojový kód je nebezpečný.
Using pripojeni As SqlConnection = New SqlConnection(connectionString)
    pripojeni.Open()
    Console.WriteLine("Zadaj anglické slovíčko na preklad")
    Dim slovo As String = Console.ReadLine()

    Dim prikaz As SqlCommand = New SqlCommand("SELECT Czech FROM Word WHERE English='" & slovo & "'", pripojeni)

    Dim dataReader As SqlDataReader = prikaz.ExecuteReader()
    While dataReader.Read()
        Console.WriteLine("Preklad: {0}", dataReader("Czech"))
    End While

    pripojeni.Close()
End Using

SQL dotaz je podobný tomu predchádzajúcemu. Nezaujímajú nás však už všetky riadky, ale iba tie, kde má stĺpec English určitú hodnotu. Podmienku v SQL dotaze sme zapísali pomocou klauzuly WHERE.

Navonok aplikácia funguje korektne:

Konzolová aplikácia
Zadej anglické slovíčko k překladu
computer
Překlad: počítač

Zamyslime sa nad tým, čo sa stane, keď nejaký používateľ zadá na preklad tento reťazec:

'; DROP TABLE Word --

Škodlivý kód sa nám vloží priamo do dotazu a spustí sa nad databázou. Útočníkovi tak dávame plnú kontrolu nad našimi dátami. V tomto prípade nám nenávratne vymaže celú tabuľku. A to je ešte pomerne nevinný útok, mohol by nám vziať aj heslá používateľov a podobne.

Bezpečnostný problém sme spôsobili priamym vkladaním hodnôt do textu SQL dotazu. Útok sa preto nazýva SQL injection tj vloženie cudzieho SQL kódu do nášho. Musíme počítať s tým, že škodlivý kód môže byť v každom parametri, ktorý do dotazu vkladáme. Nedá sa spoľahnúť na to, že táto premenná asi nebude nič od užívateľa obsahovať.

Ochrana pred SQL injekciou

V minulosti sa parametre ošetrovali špeciálnou funkciou, ktorá tzv. zoscapovala škodlivé znaky. Moderné otázky sa píšu pomocou tzv. Prepared Statements. Tie fungujú tak, že sa do dotazu namiesto parametrov vložia len špeciálne značky. Parametre sa potom odovzdávajú oddelene. Ukážme si, ako do dotazu vložiť parametre správne:

Using pripojeni As SqlConnection = New SqlConnection(connectionString)
    pripojeni.Open()
    Console.WriteLine("Zadaj anglické slovíčko na preklad")
    Dim slovo As String = Console.ReadLine()

    Dim prikaz As SqlCommand = New SqlCommand("SELECT Czech FROM Word WHERE English=@slovo", pripojeni)
    prikaz.Parameters.AddWithValue("@slovo", slovo)

    Dim dataReader As SqlDataReader = prikaz.ExecuteReader()
    While dataReader.Read()
        Console.WriteLine("Preklad: {0}", dataReader("Czech"))
    End While

    pripojeni.Close()
End Using

Všimnime si, že v SQL dotaze je len zástupná značka, ktorá sa označuje zavináčom @ a ľubovoľným názvom. Nepíšeme okolo nej ani apostrofy, tie sú dodané neskôr podľa typu značky. Pred zavolaním metódy ExecuteReader() pripojíme do dotazu parametre, v našom prípade parameter @slovo, ktorého hodnotou bude premenná slovo. Databáza si sama parametre ošetrí a nemusíme sa báť, že by nám aplikáciu niekto mohol nabúrať.

V budúcej lekcii, Databázy vo VB.NET - INSERT, UPDATE, DELETE a COUNT , sa naučíme pridávať, mazať, editovať a počítať záznamy v MS-SQL databáze vo VB.NET pomocou ADO.NET a triedy SqlCommand.


 

Mal si s čímkoľvek problém? Stiahni si vzorovú aplikáciu nižšie a porovnaj ju so svojím projektom, chybu tak ľahko nájdeš.

Stiahnuť

Stiahnutím nasledujúceho súboru súhlasíš s licenčnými podmienkami

Stiahnuté 6x (1021.43 kB)
Aplikácia je vrátane zdrojových kódov v jazyku VB.NET

 

Predchádzajúci článok
Kvíz - Databáza, prístupy, pripojená aplikácia vo VB-ADO.NET
Všetky články v sekcii
Databáza vo VB.NET - ADO.NET
Preskočiť článok
(neodporúčame)
Databázy vo VB.NET - INSERT, UPDATE, DELETE a COUNT
Článok pre vás napísal Stanislav Zita
Avatar
Užívateľské hodnotenie:
Ešte nikto nehodnotil, buď prvý!
Aktivity