Dnes: 19. srpna 2017    | Registrace | Hledáme | Redakce | Info | Testy | Školení | Ocenění | Nápověda | Čtenář: nepřihlášen

Rychlé odkazy
  • Hlavní stránka
  • Seznam rubrik
  • Ankety
  • Editoriály
  • TOP 15
  • KONFERENCE 2008
  • KONFERENCE 2007
  • KONFERENCE 2006
  • KONFERENCE 2005
  • KONFERENCE 2004
  • Sborník
  • Testy
  • Virtuální školení
  • Personalizace


  • Hledáte práci?
    Hledáme redaktora - pojďte s námi tvořit Databázový svět!

    Vyhledávání

    Hledej
    na Databázovém světě!



    Rozšířené vyhledávání

    Rubriky
    Aktuality
    Bezpečnost
    Business
    Česká scéna
    Datové sklady
    Dokumentace
    Dotazovací jazyky
    Hardware
    Historie
    Komentáře
    Literatura
    Metodologie
    Nondb
    Open Source
    Poradna
    Produkty
    Případové studie
    Redakce
    Rozhovory
    Standardy
    Technologie
    Tipy - triky
    Tiskové zprávy
    Vývoj
    Vývojové nástroje
    Zajímavosti

    Co je to?
    Datový sklad
    Tento pojem poprvé formuloval koncem 80. let William Inmon jako strategii přístupu k datům určeným pro rozsáhlé analýzy. V případě datového skladu hovoříme o historických, časově rozlišených, agregovaných, průběžně rozšiřovaných datech uspořádaných pro podporu potřeb managementu.

    Akce
    Dynamická Datová Centra
    - na semináři se seznámíte s komplexním řešením a koncepcí Dynamických Datových Center od Fujitsu Siemens Computers se speciálním důrazem na řešení FlexFrame.

    Textová inzerce
    IBPhoenix - Vše o InterBase a Firebirdu.

    Smějete se rádi? - Pak je pro vás Vtipník to pravé!

    Prodejce reklamy - Hledáme schopného prodejce reklamního prostoru, možnost i externí spolupráce.

    Přihlášený čtenář
    Nepřihlášený čtenář

    O portálu
    Databázový svět
    ISSN: 1213-5933

    Web je optimalizován pro rozlišení 1024x768, nicméně kromě větších rozlišení podporujeme i 800x600. Podrobnosti najdete zde.

    Chcete-li mít kdykoliv možnost zkontrolovat obsah našeho portálu, můžete využít podporu rss. Podrobnosti najdete zde.
    SQL injection a co s tím?


    [Bezpečnost] - SQL injection je zjednodušeně řečeno snaha udělat z programátorem vytvořeného dotazu dotaz dělající něco jiného – někdy více, někdy méně odlišného od původního záměru.



    Vzhledem k tomu, že příkaz SQL je v mnoha jazycích v nejjednodušší formě reprezentován jako textový řetězec, nabízí se nám jeho parametry do řetězce přidat. Nejčastěji pomocí operátoru konkatenace (například + (plus) či . (tečka) apod.). Tento způsob však přináší mnoho skrytých problémů.

    Pomineme-li některé základní, jako například nemožnost lehce pracovat s blob sloupci či omezení platformy na velikost vlastního příkazu, může nám útočník do příkazu zamotat i vlastní příkazy. Triviální příkaz, používaný v mnoha aplikacích, může vypadat takto:

    "select uid 
       from users 
       where name = '+username+' and password = '+somehash+';"
    

    Na první pohled nevinná konstrukce. Co ale dostaneme, pokud útočník, například změnou GET parametru nebo pouhým zadáním do vstupního políčka, zadá do username:

     
    "‘; delete from users; --"

    Rázem je všechno jinak. Výsledný dotaz bude vypadat:

    "select uid 
       from users 
       where name = ''; delete from users; --' and password = '+somehash+';"
    

    Přepsáním do čitelnější formy zjistíme, že naše SQL je najednou úplně jiné – příkaz select zůstal funkčně podobný. Ale za něj se podařilo útočníkovi dostat příkaz, který vymaže – v případě úspěchu – všechny uživatelské účty, které aplikace používá. Na konci došlo pouze k ošetření zbytku příkazu, aby byl parserem enginu ignorován.

    Možných obran je několik. Přes hledání nebezpečných slov ve vstupu, automatické escapování "(ne)správných" znaků až po používání funkcí, které neumožňují více příkazů najednou spustit (od změnění podmínky nás ale neochrání) nebo velmi pečlivě nastavená práva k jednotlivým tabulkám. Některé postupy mohou být více či méně úspěšné, ale neřeší příčinu problému (tím samozřejmě nechceme říci, že například správně nastavené uživatelské účty v databázi nejsou dobrým návykem).

    Správným postupem je nepoužívat skládání příkazů SQL jako znakové řetězce. Ale jak tedy na to? Musíme použít tzv. parametrizované příkazy (parametrized queries).

    Každé rozhranní pro přístup databázím disponuje technikou, jak předat databázovému stroji příkaz a jeho parametry odděleně. Podívejme se nejprve na zástupce webových technologií, a to na jazyk PHP ve spojení s Firebirdem a klasikou MySQL.

    Firebird

    …
    $query = fbird_prepare('select uid from users where username = ? and password = ?');
    $result = fbird_execute($query, 'Pepa', '123456');
    $row = fbird_fetch_row($result);
    …
    

    Pokud nechcete používat explicitní přípravu dotazu, je možné využít funkce fbird_query a parametry zadat přímo k dotazu.

    Pro příklad v MySQL využijeme MySQL Improved Extension.

    MySQL

    …
    $query = $mysqli->prepare('select uid from users where username = ? and password = ?');
    $query->bind_param('ss', 'Pepa', '123456');
    $query->execute();
    …
    

    Jak vidíme, používání parametrů v PHP není nic obtížného a pojem SQL injection můžeme zapomenout.

    Jako druhý příklad bude uvedena ukázka pro programovací rozhranní ADO.NET ve spojení s C# (postup se neliší pro ASP.NET ni WinForms). Demonstrace proběhne pro platformu Firebird, ale vzhledem k faktu, že provider pro Firebird implementuje rozhranní a abstraktní třídy ADO.NET, postup se nebude (mnoho) lišit pro MS SQL či Oracle.

    using (FbCommand cmd = conn.CreateCommand())
    {
      cmd.CommandText = "select uid from users where username = @username and password = @password;"
      cmd.Parameters.Add("@username", FbDbType.VarChar).Value = username;
      cmd.Parameters.Add("@password", FbDbType.VarChar).Value = password;
      int uid = cmd.ExecuteScalar();
    }
    

    Opět vidíme, že použití není o mnoho obtížnější než skládání příkazu. Tento postup je dokonce přehlednější a lehce upravitelný v budoucnu či při ladění.

    Ačkoli si můžete říci, že SQL injection se vás netýká (časem každý zjistí, že týká), tak správné návyky při vývoji aplikací je vhodné si osvojit a aplikovat kdykoli. Pomůžete tím přecházet chybám v budoucnu.

    ( Celý článek! | Autor: Jiří Činčura | Počet komentářů: 0 | Přidat komentář | Informační e-mailVytisknout článek )

    Vyhledávání
     

    Anketa
    Kolik ročně utratíte za dovolené?

    Nic 
     (1396 hl.)
    Do 1 000,- Kč 
     (982 hl.)
    Do 10 000,- Kč 
     (926 hl.)
    Do 25 000,- Kč 
     (1181 hl.)
    Do 50 000,- Kč 
     (940 hl.)
    Do 75 000,- Kč 
     (1079 hl.)
    Více než 75 000,- Kč 
     (924 hl.)

    Celkem hlasovalo: 7428


    Poslední komentáře
    frontierd@126.com
    frontierd@126.com
    frontierd@126.com
    c
    http://www.coachoutl

    Newsletter
    Přihlaste si nezávazně - i bez registrace - odběr informačního newsletteru. Podrobné informace najdete zde.

    Emailová adresa:


    Kalendář
    <<  Srpen  >>
    PoÚtStČtSoNe
     123456
    78910111213
    14151617181920
    21222324252627
    28293031   

    Redakci připojuje


    Nejčtenější

    Databáze je prázdná!


    Nejvíce komentářů

    Databáze je prázdná!


    Reklama






    Nenechte si ujít články na dalších webech




    Na této stránce použité názvy programových produktů, firem apod. mohou být ochrannými známkami
    nebo registrovanými ochrannými známkami příslušných vlastníků.

    Databázový svět | dfKlub - digitální fotografie | Vtipník - vtipy přímo k Vám | Reminder - přestaňte zapomínat | Databázový svět

    Copyright (c) 2004 AVRE Publishing, spol. s r.o. Všechna práva vyhrazena