DATABÁZOVÉ A INFORMAˇCNÍ SYSTÉMY
Transkript
Databázové a informační systémy – 2. PL/SQL II 1/52 DATABÁZOVÉ A INFORMAČNÍ SYSTÉMY Michal Krátký, Radim Bača Katedra informatiky FEI VŠB – Technická univerzita Ostrava 2012/2013 Databázové a informační systémy – 2. PL/SQL II O BSAH I Triggery I Kurzory I Vázané proměnné I Práva běhu uložených procedur I Balíky I Hromadné SQL operace v PL/SQL I COMMIT I SQL Injection 2/52 Databázové a informační systémy – 2. PL/SQL II 3/52 Triggery T RIGGER I Trigger je PL/SQL blok, který je spouštěn v závislosti na nějakém DML příkazu jako je INSERT, UPDATE nebo DELETE. I Obecně je možné triggery navěsit i na další operace (DML nad pohledy, DDL příkazy, systémové události). Databázové a informační systémy – 2. PL/SQL II 4/52 Triggery T RIGGER , SYNTAXE CREATE [OR REPLACE ] TRIGGER j m e n o _ t r i g g e r u {BEFORE | AFTER | INSTEAD OF } { INSERT [OR] | UPDATE [OR] | DELETE} [OF jmeno_sloupce ] ON jmeno_tabulky [ REFERENCING OLD AS s t a r a _ h o d n o t a NEW AS nova_hodnota ] [FOR EACH ROW [WHEN ( podminka ) ] ] BEGIN p ř í k a z y END; Databázové a informační systémy – 2. PL/SQL II 5/52 Triggery S YNTAXE , SPECIFIKACE SQL P ŘÍKAZU I Specifikace SQL operace, který spouští trigger: INSERT, UPDATE, DELETE. I Můžeme použít víc operací. I OF jmeno_sloupce – trigger se spouští jen při aktualizaci atributu jmeno_sloupce. I ON jmeno_tabulky – specifikujeme tabulku na kterou se trigger váže. Databázové a informační systémy – 2. PL/SQL II Triggery S YNTAXE , MÍSTO SPUŠT ĚNÍ TRIGGERU I Povinná část, specifikujeme ve kterou chvíli se má trigger spouštět. I BEFORE - před provedením SQL příkazu. I AFTER - po provedením SQL příkazu. I INSTEAD OF - provedením místo SQL příkazu. 6/52 Databázové a informační systémy – 2. PL/SQL II 7/52 Triggery FOR EACH ROW [FOR EACH ROW [WHEN (podminka)]] I Implicitně se trigger spouští pouze jednou pro jeden příkaz (který může měnit více záznamů). I Tímto volitelným parametrem specifikujeme, že trigger má být spouštěn pro každý záznam, který je SQL příkazem měněn. I Za WHEN můžeme dále specifikovat podmínku, při jejímž splnění se má trigger spustit. Databázové a informační systémy – 2. PL/SQL II Triggery P OJMENOVÁNÍ STARÝCH A NOVÝCH HODNOT [REFERENCING OLD AS stara_hodnota NEW AS nova_hodnota] I Volitelný parametr. I Umožňuje pojmenovat pomocí proměnné staré a nové hodnoty záznamu se kterým manipulujeme. I Implicitně jsou tyto proměnné pojmenovány jako :OLD a :NEW. 8/52 Databázové a informační systémy – 2. PL/SQL II 9/52 Triggery P ŘÍKLAD Při mazání záznamu z tabulky Student budeme mazaný záznam ukládat do tabulky Hist_stud. CREATE OR REPLACE TRIGGER d e l _ s t u d e n t BEFORE DELETE ON s t u d e n t FOR EACH ROW BEGIN INSERT INTO H i s t _ s t u d ( l o g i n , name , surname ) v a l u e s ( : OLD. l o g i n , :OLD. name , :OLD. surname ) END; Databázové a informační systémy – 2. PL/SQL II 10/52 Triggery P ROBLÉM MUTUJÍCÍCH TABULEK I Pokud se pokusíme v triggeru číst či modifikovat stejnou tabulku dostaneme mutating table error (i.e. ORA-04091). I Takovému triggeru bychom se měli vyhnout, existují ovšem techniky, které umožní podobnou funkcionalitu provést. Databázové a informační systémy – 2. PL/SQL II 11/52 Kurzory K URZORY Kurzory jsou pomocné proměnné vytvořené po provedení nějakého SQL příkazu. Tyto pomocné proměnné nám umožní procházet výsledek příkazu. Existují dva typy kurzorů: I Implicitní kurzor – vytváří se automaticky po provedení příkazů jako INSERT, DELETE nebo UPDATE. I Explicitní kurzor – definuje se již v definiční části procedury podobně jako proměnná. Takový kurzor je často spojen s příkazem SELECT, který vrací více než jeden řádek. Databázové a informační systémy – 2. PL/SQL II Kurzory Explicitní kurzor E XPLICITNÍ KURZOR I Definice explicitního kurzoru má následující syntaxi: CURSOR jmeno_kursoru IS prikaz_select; I Kde prikaz_select vrací množinu záznamů. I Pomocí kurzoru můžeme postupně procházet jednotlivé záznamy výsledku SELECT příkazu a pracovat s jednotlivými hodnotami výsledku. I V každém kroku programu ukazuje kurzor pouze na jeden záznam výsledku. 12/52 Databázové a informační systémy – 2. PL/SQL II Kurzory Explicitní kurzor P RÁCE S EXPLICITNÍM KURZOREM Práce s kurzorem probíhá pomocí následujících příkazů: I OPEN jmeno_kurzoru – otevírá kurzor. Prakticky provádí SQL příkaz spojený s kurzorem a nastaví kurzor na první záznam výsledku. I FETCH jmeno_kurzoru INTO promenna_zaznam – načítá aktuální záznam kurzoru do proměnné promenna_zaznam a posune se na další záznam. I CLOSE jmeno_kurzoru – zavírá kursor. 13/52 Databázové a informační systémy – 2. PL/SQL II Kurzory Explicitní kurzor P ŘÍKLAD Následujícím kurzorem načítáme příjmení všech záznamů z tabulky Student. DECLARE CURSOR c_surname IS SELECT ∗ FROM Student ; v _ r e c o r d Student%ROWTYPE; v_tmp INTEGER : = 0 ; BEGIN OPEN c_surname ; LOOP FETCH c_surname INTO v _ r e c o r d ; EXIT WHEN c_surname%NOTFOUND; v_tmp : = c_surname%ROWCOUNT; DBMS_OUTPUT. PUT_LINE ( v_tmp | | v _ r e c o r d . surname ) ; END LOOP; CLOSE c_surname ; END; 14/52 Databázové a informační systémy – 2. PL/SQL II Kurzory Explicitní kurzor cyklem FOR E XPLICITNÍ KURZOR CYKLEM FOR I O něco jednodušší je práce s kurzorem při použití cyklu FOR. medskip I V tomto případě nemusíme kurzor explicitně uzavírat pomocí CLOSE. 15/52 Databázové a informační systémy – 2. PL/SQL II 16/52 Kurzory Explicitní kurzor cyklem FOR P ŘÍKLAD , VARIANTA 1 Následujícím kurzorem načítáme příjmení všech záznamů z tabulky Student. DECLARE CURSOR c_surname IS SELECT surname FROM Student ; v_surname Student . surname%TYPE ; v_tmp NUMBER : = 0 ; BEGIN FOR one_surname IN c_surname LOOP v_tmp : = c_surname%ROWCOUNT; v_surname : = one_surname . surname ; DBMS_OUTPUT. PUT_LINE ( v_tmp | | ’ ’ | | v_surname ) ; END LOOP; END; Databázové a informační systémy – 2. PL/SQL II 17/52 Kurzory Explicitní kurzor cyklem FOR P ŘÍKLAD , VARIANTA 2 Zde vidíme variantu kurzoru s cyklem FOR, kde nedeklarujeme proměnnou typu CURSOR. DECLARE v_surname Student . surname%TYPE ; v_tmp NUMBER : = 0 ; BEGIN FOR one_surname IN (SELECT surname FROM Student ) LOOP v_tmp : = v_tmp + 1 ; v_surname : = one_surname . surname ; DBMS_OUTPUT. PUT_LINE ( v_tmp | | ’ ’ | | v_surname ) ; END LOOP; END; Databázové a informační systémy – 2. PL/SQL II 18/52 Kurzory OPEN/FETCH/CLOSE vs FOR OPEN/FETCH/CLOSE VS FOR I Přestože cyklus FOR má na první pohled jednodušší zápis a rovněž nemusíme myslet na uzavíraní příkazem CLOSE, nebyl dříve doporučen při práci s větším množstvím záznamů. I FETCH se prováděl po jednotlivých záznamech. I Doporučoval se explicitní kurzor a čtení více záznamů současně do pole (FETCH BULK INTO). I Od verze Oracle 10g se na pozadí načítají záznamy po 100 do bufferu. I Vzhledem k jednoduššímu zápisu, je tedy vhodnější použít u novějších verzích SŘBD Oracle cyklus FOR. Databázové a informační systémy – 2. PL/SQL II Vázané proměnné Z PRACOVÁNÍ DOTAZU Uvažujme situaci kdy posíláme na databázový systém tisíce příkazů SELECT jako např.: SELECT fname , lname , address FROM Student WHERE l o g i n = ’ kra228 ’ ; 19/52 Databázové a informační systémy – 2. PL/SQL II 20/52 Vázané proměnné Z PRACOVÁNÍ DOTAZU Databázový systém nejprve kontroluje zda příkaz již nebyl dříve zaslán. I I 1 Pokud byl poslán poprvé: I Každý zaslaný dotaz je parsován a je pro něj vytvořen plán vykonávání dotazu1 . I Dotaz může být vykonán mnoha způsoby, systém hledá ten nejefektivnější. I Tento proces může v některých případech trvat déle než samotné vykonání dotazu. Pokud byl dotaz již dříve poslán: SŘBD využije již dříve sestavený plán vykonávání dotazu. Viz pozdější přednášky a předmět Databázové systémy Databázové a informační systémy – 2. PL/SQL II 21/52 Vázané proměnné KONTROLA JEDINE ČNOSTI DOTAZU I I Při kontrole zda stejný dotaz nebyl již dříve odeslán na systém, SŘBD kontroluje celý řetězec dotazu. Tyto dotazy tedy nejsou identické a pro druhý dotaz opět proběhne zpracování dotazu: SELECT fname , WHERE l o g i n SELECT fname , WHERE l o g i n I I lname , address FROM Student = ’ kra228 ’ ; lname , address FROM Student = ’ fer452 ’ ; Celý problém se typicky ukáže ve chvíli kdy systém obsahuje ostrá (často rozsáhlá data) a k systému začne přistupovat více uživatelů. Jelikož firemní informační systémy se nepíšou pro jednoho uživatele a jednotky záznamů, musíme umět psát kód maximálně efektivně. Databázové a informační systémy – 2. PL/SQL II 22/52 Vázané proměnné VÁZANÉ PROM ĚNNÉ I Vázané proměnné nám umožní využít již vytvoření plán vykonávání dotazu pro dotazy, které se liší v zadaných hodnotách. I Vázané proměnné jakou jakési substituční proměnné, které používáme namísto literálů, např.: SELECT fname , lname , address FROM Student WHERE l o g i n = : l o g i n ; I Tyto proměnné mají stejný efekt jako bychom na databázi poslali totožné dotazy, přestože za proměnou dosazujeme různé hodnoty. I Snižujeme čas vykonávání dotazu a tedy i zátěž systému (a zvyšujeme propustnost). Databázové a informační systémy – 2. PL/SQL II Vázané proměnné S TATICKÉ PL/SQL I Statické PL/SQL automaticky používá vázané proměnné, např.: CREATE OR REPLACE PROCEDURE l o g i n I n t o S y s t e m ( p _ l o g i n IN VARCHAR) AS num INT ; BEGIN SELECT COUNT( ∗ ) INTO num FROM Student WHERE l o g i n = p _ l o g i n ; ... END; / I Každá proměnná použitá ve statickém PL/SQL je vázaná proměnná. 23/52 Databázové a informační systémy – 2. PL/SQL II 24/52 Vázané proměnné DYNAMICKÉ PL/SQL I I V případě dynamického PL/SQL (řetězce, které spouštíme příkazem EXECUTE IMMEDIATE) takové proměnné k dispozici implicitně nemáme. Typické vytváření dotazu pomocí spojování řetězců vyústí v neefektivní zpracování každého dotazu v SŘBD, např.: CREATE OR REPLACE PROCEDURE updateClass ( p _ l o g i n IN VARCHAR) AS BEGIN EXECUTE IMMEDIATE ’UPDATE Student c l a s s = c l a s s + 1 WHERE l o g i n = ’ | | p _ l o g i n ; COMMIT; END; / Databázové a informační systémy – 2. PL/SQL II Vázané proměnné DYNAMICKÉ PL/SQL I Vázání proměnné s proměnnou v řetězci u dynamického PL/SQL provedeme klíčovým slovem USING, např.: CREATE OR REPLACE PROCEDURE updateClass ( p _ l o g i n IN VARCHAR) AS BEGIN EXECUTE IMMEDIATE ’UPDATE Student c l a s s = c l a s s + 1 WHERE l o g i n = : x ’ USING p _ l o g i n ; COMMIT; END; / I Upozornění: vázané proměnné můžeme použít pouze u literálů (hodnoty atributů), tedy ne např. pro dynamicky získávané jméno tabulky (zde musíme použít spojení řetězců). 25/52 Databázové a informační systémy – 2. PL/SQL II 26/52 Vázané proměnné P OROVNÁNÍ VÝKONU I Zadání: napište anonymní proceduru, které bude vypisovat názvy objektů z tabulky ALL_OBJECTS pro objekty s id 1 – 1000. I Budeme testovat výkon při použití i bez použití vázaných proměnných. Databázové a informační systémy – 2. PL/SQL II Vázané proměnné P ŘÍKLAD , BEZ VÁZANÝCH PROM ĚNNÝCH 1/2 DECLARE TYPE r c IS REF CURSOR; v_rc rc ; v_dummy ALL_OBJECTS .OBJECT_NAME%t y p e ; v _ s t a r t NUMBER DEFAULT DBMS_UTILITY . GET_TIME ; BEGIN FOR i IN 1 . . 1000 LOOP OPEN v _ r c FOR ’ s e l e c t object_name from a l l _ o b j e c t s where o b j e c t _ i d = ’ | | i ; FETCH v _ r c INTO v_dummy ; CLOSE v _ r c ; −− DBMS_OUTPUT. PUT_LINE ( v_dummy ) ; END LOOP; 27/52 Databázové a informační systémy – 2. PL/SQL II 28/52 Vázané proměnné P ŘÍKLAD , BEZ VÁZANÝCH PROM ĚNNÝCH 2/2 DBMS_OUTPUT. PUT_LINE ( round ( ( DBMS_UTILITY . GET_TIME−v _ s t a r t ) / 1 0 0 , 2 ) | | END; / ’ s ’ ); Poznámka: DBMS_UTILITY.GET_TIME vrací hodnotu čítače v setinách sekund od začátku nějakého období. Databázové a informační systémy – 2. PL/SQL II Vázané proměnné P ŘÍKLAD , POUŽITÍ VÁZANÝCH PROM ĚNNÝCH 1/2 DECLARE TYPE r c IS REF CURSOR; v_rc rc ; v_dummy ALL_OBJECTS .OBJECT_NAME%t y p e ; v _ s t a r t NUMBER DEFAULT DBMS_UTILITY . GET_TIME ; BEGIN FOR i IN 1 . . 1000 LOOP OPEN v _ r c FOR ’ s e l e c t object_name from a l l _ o b j e c t s where o b j e c t _ i d = : x ’ USING i ; FETCH v _ r c INTO v_dummy ; CLOSE v _ r c ; −− DBMS_OUTPUT. PUT_LINE ( v_dummy ) ; END LOOP; 29/52 Databázové a informační systémy – 2. PL/SQL II 30/52 Vázané proměnné P ŘÍKLAD , POUŽITÍ VÁZANÝCH PROM ĚNNÝCH 2/2 DBMS_OUTPUT. PUT_LINE ( round ( ( DBMS_UTILITY . GET_TIME−v _ s t a r t ) / 1 0 0 , 2 ) | | END; / ’ s ’ ); Databázové a informační systémy – 2. PL/SQL II Vázané proměnné P OROVNÁNÍ VÝKONU I Čas bez využití vázaných proměnných: 65.48s. I Čas s využitím vázaných proměnných: 0.25s. I Nevyužívání vázaných proměnných je tedy značně neefektivní! 31/52 Databázové a informační systémy – 2. PL/SQL II 32/52 Vázané proměnné VÁZANÉ PROM ĚNNÉ V DALŠÍCH PROGRAMOVACÍCH JAZYCÍCH A S ŘBD I C# (ADO.NET) a Java (JDBC) rovněž podporují vázané proměnné. I V tomto případě se jim říká parametrizované nebo předpřipravené dotazy (např. v Javě máme k dispozici třídu PreparedStatement). I Popisované vlastnosti nejsou závislé pouze na SŘBD Oracle, ale jsou platné pro další SŘBD (např. SQL Server). Databázové a informační systémy – 2. PL/SQL II Hromadné SQL operace v PL/SQL H ROMADNÉ SQL OPERACE V PL/SQL I Typické (neefektivní) vkládání většího počtu záznamů je vkládání po jednom záznamu. I U většiny SŘBD můžeme ale využít tzv. hromadných operací. I Vkládáním většího počtu záznamů najednou snížíme režii zotavení (zápis do logu) a datových struktur (menší počet aktualizací diskových stránek). I Výsledkem je rychlejší vkládání záznamů. I Lze použít pro statické i dynamické SQL. I U SŘBD Oracle používáme operace BULK COLLECT a FORALL. 33/52 Databázové a informační systémy – 2. PL/SQL II Hromadné SQL operace v PL/SQL BULK COLLECT I BULK COLLECT říká SQL enginu aby navázal výstupní kolekci s PL/SQL enginem. I BULK LOAD používáme zejména s příkazem SELECT INTO. I Syntaxe je následující: ... BULK COLLECT INTO collection_name[, collection_name] ... 34/52 Databázové a informační systémy – 2. PL/SQL II Hromadné SQL operace v PL/SQL FORALL I (Nejedná se o cyklus.) I FORALL říká PL/SQL enginu aby navázal vstupní kolekci před jejím posláním do SQL enginu. I Syntaxe: FORALL index IN lower_bound..upper_bound sql_statement; I Kde: I I I index je index pole sql_statement je INSERT, UPDATE nebo DELETE lower_bound..upper_bound ohraničuje index pole 35/52 Databázové a informační systémy – 2. PL/SQL II 36/52 Hromadné SQL operace v PL/SQL P ŘÍKLAD DECLARE TYPE NumTab IS TABLE OF employees . employee_id%TYPE ; TYPE NameTab IS TABLE OF employees . last_name%TYPE ; enums NumTab ; names NameTab BEGIN SELECT employee_id , last_name BULK COLLECT INTO enums , names FROM employees WHERE employee_id > 1000; ... FORALL i IN enums . FIRST . . enums . LAST UPDATE myemp SET name = names ( i ) WHERE employee=enums ( i ) ; Databázové a informační systémy – 2. PL/SQL II 37/52 Hromadné SQL operace v PL/SQL E FEKT HROMADNÉHO VKLÁDÁNÍ DAT2 Příklad: I Vložení 100 000 záznamů do tabulky s primárním klíčem. I Porovnání vkládání po 1 záznamu a v dávkách po 10 000. Celkový čas [s] Vkládání po 1 záznamů 7 Hromadné vkládání 0,9 Zlepšení hromadného vkládání je 87% (7.7×)! Pokud můžete, používejte hromadné operace! 2 (c) David Krch, Oracle ČR: PL/SQL Rozdíl 6.1 Databázové a informační systémy – 2. PL/SQL II Další rysy PL/SQL Balíky BALÍKY 1/2 I Balíky mají podobnou funkci jako knihovny v jiných programovacích jazycích. I Shlukují PL/SQL objekty (funkce, procedury, proměnné, výjimky atd.) do jednoho místa. 38/52 Databázové a informační systémy – 2. PL/SQL II Další rysy PL/SQL Balíky BALÍKY 2/2 I Balíky mají hned několik výhod: I Umožňují deklarovat proměnné a výjimky která jsou dostupné i mimo proceduru či funkci. I Vytvoření veřejných a privátních funkcí a procedur. Pomocné (privátní) PL/SQL bloky tedy bude možné volat jen z procedur a funkcí uvnitř balíku. I Vytvoření vlastního jmenného prostoru, kde je možné mít libovolná jména PL/SQL objektů. I Snadnější orientace v PL/SQL kódu. Výhodné zejména u větších projektů. 39/52 Databázové a informační systémy – 2. PL/SQL II 40/52 Další rysy PL/SQL Balíky BALÍKY I Balíky jsou vytvářeny ve dvou částech: specifikace balíku a tělo balíku. I Specifikace balíku představuje veřejnou část, která je dostupná nejen uvnitř balíku. Obsahuje definice veřejných proměnných, výjimek a hlaviček procedur a funkcí. I Tělo balíku pak obsahuje neveřejnou část balíku a definice procedur a funkcí deklarovaných ve specifikaci balíku. Databázové a informační systémy – 2. PL/SQL II 41/52 Další rysy PL/SQL Balíky BALÍKY Specifikace balíku: CREATE [OR REPLACE ] PACKAGE package_name IS | AS v e ř e j n é d e k l a r a c e podprogram ů , t y p ů a prom ěnných END [ package_name ] ; Tělo balíku: CREATE [OR REPLACE ] PACKAGE BODY package_name IS | AS p r i v á t n í č á s t b a l í k u END [ package_name ] ; Databázové a informační systémy – 2. PL/SQL II Další rysy PL/SQL Práva běhu uložených procedur P RÁVA B ĚHU ULOŽENÝCH PROCEDUR I Implicitně běží kód uložených procedur/funkcí/balíčků s právy vlastníka (tedy toho kdo proceduru vytvořil). I Tento režim se označuje AUTHID DEFINER. I Aktuální schéma = schéma vlastníka procedury. I Druhou možností je, aby kód běžel s právy aktuálního uživatele (tedy ten kdo proceduru spustil). I Volba: AUTHID CURRENT_USER (od Oracle 8i) I aktuální schéma = schéma aktuálního uživatele 42/52 Databázové a informační systémy – 2. PL/SQL II Další rysy PL/SQL Práva běhu uložených procedur P ŘÍKLAD CREATE TABLE s t u d ( id INT p r i m a r y key NOT NULL, lname VARCHAR2( 5 0 ) NOT NULL ) ; CREATE OR REPLACE PROCEDURE myproc ( a IN OUT VARCHAR) AUTHID CURRENT_USER AS BEGIN SELECT lname i n t o a FROM s t u d WHERE i d =1; END; −− s p u s t e n i DECLARE a VARCHAR( 5 0 ) ; BEGIN myproc ( a ) ; END; 43/52 Databázové a informační systémy – 2. PL/SQL II Další rysy PL/SQL COMMIT COMMIT I Oracle podporuje tyto volby příkazu COMMIT COMMIT [WRITE [WAIT | NOWAIT] [IMMEDIATE | BATCH]] I Pokud jsou aktualizována data důležitá použijeme WAIT: I COMMIT čeká než dojde k zápisu do REDO logu. I ⇒ Je zaručeno korektní potvrzení aktualizací. 44/52 Databázové a informační systémy – 2. PL/SQL II Další rysy PL/SQL COMMIT COMMIT I Oracle podporuje tyto volby příkazu COMMIT COMMIT [WRITE [WAIT | NOWAIT] [IMMEDIATE | BATCH]] I V případě NOWAIT může dojít ke ztrátě dat: I COMMIT vyžádá zápis do REDO logu, ale nečeká. I Data jsou zpřístupněna ostatním transakcím. I K zápisu do REDO logu může dojít s mírným zpožděním – po určitou dobu je možná ztráta dat transakce! I Může mít smysl tam, kde je podstatná maximální propustnost (počet transakcí za čas), ale cena 1 ztracená transakce je nízká – např. zasílání zpráv. 45/52 Databázové a informační systémy – 2. PL/SQL II Další rysy PL/SQL Útok SQL Injection Ú TOK SQL I NJECTION I Text získaný od uživatele (resp. vně systému), např. z webového formuláře: I Pomocí spojení řetězců pak vytvoříme dotaz, např.: OPEN c FOR ’SELECT fname , lname , s a l a r y ’ | | ’FROM employees ’ | | ’WHERE lname = ’ ’ ’ | | p_lname || ’ ’ ’ ’; 46/52 Databázové a informační systémy – 2. PL/SQL II Další rysy PL/SQL Útok SQL Injection Ú TOK SQL I NJECTION I Pokud uživatel (v tomto případě útočník) zadá místo příjmení například: X’ or 1=1 -- I Výsledkem je řetězec: SELECT fname , lname , s a l a r y FROM employees WHERE lname = ’X ’ o r 1=1 −−’ I 3 Combo boxy formuláře nic neřeší, útočník může napsat text do přímo do URL3 : http://server/stranka?vstup=X’ or 1=1 -- (Hodnota v ukázce není zakódovaná: mezery → %20, atd.) 47/52 Databázové a informační systémy – 2. PL/SQL II 48/52 Další rysy PL/SQL Útok SQL Injection JAK SE VYHNOUT SQL I NJECTION V PL/SQL? I Když to jde, používejte statické dotazy. I V dynamických dotazech používejte vázané proměnné pro nastavení hodnoty atributu. I Pod daným uživatelem v databázi nemějte vytvořené tabulky, které nenáleží k dané aplikaci (tj. nastavte správné řízení přístupu). Tímto opatřením budete minimalizovat následky útoku. Databázové a informační systémy – 2. PL/SQL II 49/52 Další rysy PL/SQL Útok SQL Injection JAK SE VYHNOUT SQL I NJECTION V PL/SQL? I Tam kde hodnota od uživatele ovlivňuje řetězec dotazu (tj. nelze použít vázané proměnné): I Nepoužívejte hodnotu přímo (např. převod řetězce získaného od uživatele na číslo). I Pokud bude text od uživatele použit jako jméno objektu z databáze (např. tabulky), zkontrolujte či upravte text (může obsahovat potencionálně nebezpečné znaky ’ nebo ") pomocí DBMS_ASSERT nebo zkontrolujte existenci objektu v systémovém katalogu (např. USER_TABLES). Databázové a informační systémy – 2. PL/SQL II 50/52 Další rysy PL/SQL Útok SQL Injection JAK SE VYHNOUT SQL I NJECTION ? Používejte vázané proměnné. I Nepoužívejte: ’SELECT ∗ FROM employees WHERE fname = ’ ’ ’ | | p_fname | | ’ ’ ’ AND lname = ’ ’ ’ | | p_lname | | I Používejte: ’SELECT ∗ FROM employees WHERE fname = : 1 AND lname = : 2 ’ ; Zamezíte SQL Injection. ’ ’ ’ ’; Databázové a informační systémy – 2. PL/SQL II ? I Má smysl psát logiku aplikace v PL/SQL? I Rozhodně ano! I Jsme nejblíž databázi, na straně klienta efektivitu nemůže ovlivnit v takové míře jako v PL/SQL. I Postup: I I I I 4 Co jde napsat v SQL, napište v SQL. Co nejde napsat v SQL, napište ve statickém PL/SQL4 . Co nejde napsat ve statickém PL/SQL, napište v dynamickém PL/SQL. Co nejde napsat v PL/SQL, napište v klientské aplikaci. Nebo jiném procedurálním rozšíření SQL. 51/52 Databázové a informační systémy – 2. PL/SQL II R EFERENCE I I Portál materiálů k Oracle: http://www.oracle.com/pls/ db112/portal.all_books: I PL/SQL Language Reference I PL/SQL Packages and Types Reference Bind variables - The key to application performance, http://www.akadia.com/services/ora_bind_variables.html, 2010. 52/52
Podobné dokumenty
Nové vlastnosti IDS 11.50
FOR A2 = 1 TO 100
LET A3 = A0 || A2 || A1;
EXECUTE IMMEDIATE A3 ;
END FOR;
SELECT COUNT(DISTINCT C1) INTO
A4 FROM T1;
RETURN A4;
END PROCEDURE;
-- should return 100 as 100 unique
values got
-- inse...
Databázové systémy I.
uvedeny za klauzuli GROUP BY. Omezení výsledku skupinového dotazu lze pomoci klauzule HAVING
podmínka_pro_agregované_veličiny. Omezení za klauzuli HAVING se aplikuji až po vytvoření skupin.
Geo ckych pruzkumu objektu
obzory v oboru architektury a památkových objektů. Dalším důvodem pak byla možnost seznámit se
podrobněji se současným stavem 3D (troj dimenzionálních) technologií, které do geografických
informačn...
DATABÁZOVÉ A INFORMAˇCNÍ SYSTÉMY
Programátor oznamuje transakčnímu manageru, že
transakce byla úspěšně dokončena, databáze je nyní v
korektním stavu, a všechny změny provedené v rámci
transakce mohou být trvale uloženy v data...
CZTvorba obsahu
v současnosti používaných potíže nemá, pouze Internet Explorer tuto funkci
podporuje až od verze 10).
Typicky je u nahrávaného snímku vyžadována minimální velikost potřebná pro
vybraný styl.
Freedom / IQ
Vynikající vlastnosti židle Freedom / IQ mohou být využívány s minimální potřebou nastavování ovládacích prvků.
Židle Freedom / IQ definuje novou úroveň pracovních standardů umožňující nové způsoby...
Všeobecné smluvní podmínky
2.7 Poskytovatel je oprávněn v průběhu trvání smlouvy změnit tyto smluvní podmínky nebo ceník doplňkových služeb. Taková změna bude oznámena na internetových stránkách
poskytovatele, a to nejpozděj...