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)
.
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