© 2013 All rights reserved.
2

Ukládání dat: Databáze jako úložiště dat

Data jsou prakticky jediná věc, kterou můžeme na internetu nabízet. Návštěvník, přijde na náš web jenom proto, aby se dozvěděl nějakou informaci. V minulém díle jsme se věnovali ukládání dat do souboru, v tomto článku si řekneme něco o ukládání dat do databáze.

Pokud jste nečetli článek o ukládání dat, doporučuji ho přečíst, protože tento článek na něj volně navazuje.

Lepším, bezpečnějším, přehlednějším a mnohdy rychlejším řešením než používat pro ukládání dat soubory je používat databázi.

Databáze MySQL má jedinečně vyřešené přidělování práv. Můžeme snadno vytvořit podmínky pro připojování k databázi. Nastavit můžeme kdo a odkud se bude moci k databázi připojovat a pro každého takto vytvořeného uživatele lze ještě vytvářet další podmínky oprávnění a omezení.

Bohužel toto nastavování je pro normálního uživatele, který si zaplatí hosting u nějaké společnosti, nepotřebná věc, protože je malá pravděpodobnost, že by si uživatel mohl sám nastavovat oprávnění k databázi. Tohoto úkolu se většinou ujme správce serveru, který vám nastaví práva přesně podle zaplacené částky za hosting.

Další věc je, že většina hostingů ani nepodporuje připojování se z jiného místa než vlastních serverů. Toto je rozumné, protože by potom nebyl problém pro kohokoli odposlouchávat tuto komunikaci a zjistit si hesla k databázi, no a potom se odkudkoli připojit.

Přihlašovací údaje k databázi

Bohužel někdy útočník nemusí přistupovat ani k tak drastické metodě, jako je odposlouchávání, neboť v případě ukládání hesel je dost často chybováno a jsou ukládány s příponou jinou než je .php. (viz: Soubory jako datová úložiště.).

Pokud bychom chtěli mít přihlašovací údaje správně zabezpečeny, je nejlepší je a nejbezpečnější je uložit přímo do souboru pro připojení, který budeme potom includovat všude kam bude potřeba a můžeme jej ještě navíc uložit na místo, kam nemá normální uživatel přístup.

Takový soubor pro připojení může potom vypadat takto:

Takto jsme si vytvořili třídu, kterou když se někdo pokusí zobrazit a zadá přímo url, tak dostane prázdnou stránku, protože nebude nic vykonáno, protože není volána žádná funkce.

Pro připojení ji potom budeme dědit do jiné třídy, ve které spustíme konstruktor naší třídy a tím se připojíme k databázi:

Tím pádem nemá nikdo možnost zobrazit hodnoty našich proměnných pro připojení, a ani využívat připojení.

Zabezpečení dat v databázi

Databázové servery jsou většinou umístěny u poskytovatele hostingu a tím pádem nemáte plnou
kontrolu nad serverem. A co je horší, většinou je databázový server umístěn jinde než server webový.

Tyto dva servery mezi sebou musí nějakým způsobem komunikovat a vyměňovat si informace. Určitě vás napadne, že přihlašovací údaje se nemohou jenom tak přenášet bez jakékoli kontroly. Jistě, přihlašovací údaje k databázi se sice přenáší šifrovaně, ale co ostatní informace?

Bohužel, ostatní informace – obsah tabulek, se šifrovaně nepřenáší. Nic tedy nebrání v odposlouchávání těchto dat. Proto je důležité zabezpečení citlivých informací. .

Určitě je zbytečné zabezpečovat nějaký článek publikovaný na našem webu, ale i přesto najdete informace, které nechcete útočníkovy sdělit.

V případě hesel je tedy účinné používat nějaké hashovací funkce, jako je například MD5, nebo SHA-1 a tyto hashe pak mezi sebou porovnávat. Takové hesla je pak dost těžké zjistit i když má útočník plnou kontrolu nad databázi.

Další možností, kterou nám nabízí přímo MySQL je použití některé její vlastní funkce. Například funkcíAES_ENCRYPT, AES_DECRYPT. Tyto funkce jsou přímo součástí MySQL, provádíme je tedy na straně databázového serveru. Před vložením do databáze si musíme nadefinovat nějaký tajný klíč, který aplikujeme na každou vkládanou položku. Podle tohoto klíče budou data zašifrována.

V praxi takové vkládání do databáze vypadá takto:

V případě úspěchu se vypíše, že data byla vložena a skript skončí. V případě neúspěchu se nevypíše nic.

Mohli bychom si nechat vypsat dotaz, aby bylo jasné jak vypadá:

Jako data se nám v tomto případě vloží nějaký řetězec, zakódovaný právě pomocí našeho tajného klíče. Takový řetězec není jednoduché bez znalosti tajného klíče rozšifrovat zpět, takže v tomto případě má útočník smůlu a uvidí jenom hromadu znaků.

Při výběru z databáze musíme zase použít stejný klíč, pomocí nějž získáme původní informaci. Pokud bychom nepoužili stejný klíč, měli bychom smůlu.

Funkce pro výpis může potom vypadat takto:

Na výstupu z databáze dostaneme slovo „informace“.

Pokud bychom vybrali data bez našeho klíče, dostali bychom na výstup jenom hromadu znaků.
Další možností je použití jiné funkce, a to funkce DECODE a ENCODE. Funkce jsou podobné funci DECRYPT, jenom využívají jiný algoritmus pro vytvoření obrazu.

Při používání si zase musíme zvolit klíč, který použijeme pro vkládání i výběr z databáze.

Pokud chcete používat jakékoli šifrování a kódování dat, dávejte si pozor aby jste to nepřeháněli. Každý výpočet stojí čas serveru, a potom se tím může hodně zpomalit rychlost vaší aplikace. Proto tyto funkce, které jsou výpočetně dost náročné aplikujte jenom na opravdu potřebná data. Představte si například, když musí databáze projít několik tisíc výsledků vyhledávání, všechny dešifrovat a seřadit.

Další nevýhoda je, že bude v databázi potřeba určitě více místa, protože šifrované řetězce jsou většinou delší než řetězce nešifrované.

Comments are closed for this page

Pro ukládání citlivých dat doporučuji spíše asymetrickou kryptografii: http://php.vrana.cz/ukladani-citlivych-informaci.php

Její výhoda spočívá v tom, že šifrovat lze bez hesla a heslo nutné pro dešifrování není nutné nikam ukládat, takže se k němu útočník nemá jak dostat.

a nebylo by lepší začít rovnou s PDO ?

About
Hi, i am programmer from the Czech Republic. I love web development (Ruby, Ruby on Rails, PHP, Nette) and iOS development (Objective-C, Cocoa).
To cooperate, here is my phone:
+420 608 836