PHP (45) - Jsou data v databázi v bezpečí?
Zafilozofujme trochu na téma bezpečnosti dat aneb trocha paranoi nikdy neuškodí.
8.9.2004 15:00 |
Petr Zajíc
| Články autora
| přečteno 46837×
Dejme tomu, že po přečtení dvou předchozích dílů už máme představu o
tom, jak naši aplikaci zrychlit. Je ale obecně uložení dat v databázi
bezpečné? Jak
uvidíme v dnešním víceméně teoretickém článku, něco málo pro to můžeme
udělat. Základní otázky databázové
bezpečnosti si rozdělíme na "kdo", "kde" a "co".
Kdo může do databáze
MySQL má originální mechanismus přidělování práv. Lze určit kdo a
odkud se smí k databázi připojit, a pro každou kombinaci uživatele a
místa z něhož se připojuje lze nastavit určitá oprávnění, respektive
omezení. To byla ta dobrá zpráva. Špatné zprávy jsou, že:
- Většinou nebudete mít oprávnění nastavovat oprávnění ;-)) protože
to bude dělat správce serveru
- Většinou nebudete mít oprávnění připojovat se ke své databázi z
libovolného místa na internetu. To je rozumné, protože komunikaci mezi
Vámi a databází by mohl někdo odposlouchávat.
Z hlediska PHP se dělá někdy chyba - poměrně častý způsob uložení
přihlašovacích informací (název hostitele, jméno, heslo) je umístit je
do souboru, který se bude do výsledného skriptu vkládat pomocí include,
resp. require. To samo o sobě není nebezpečné. Co je ale opravdu špatný
nápad - ukládat soubory s jinou příponou než php. Jak například víte,
že server nepošle soubory s příponou inc přímo do prohlížeče a někdo si
nebude moci Vaše přihlašovací údaje přečíst?
Není heslo jako heslo
Aby nedocházelo k matení pojmů, dodejme rovnou, že uživatelé Vašich
stránek samozřejmě nebudou muset znát Vaše přihlašovací údaje k
databázi. Uživatelé se možná ověří pomocí nějakého mechanizmu (ten
budete muset napsat!) a PHP pak vytvoří databázové spojení (klidně i
několik) stále se stejnými
přihlašovacími údaji. Takže budete-li mít webový obchod s
registrovanými uživateli "Pepa" a "Jarda", bude typický scénář práce
následující:
- Uživatel "Pepa" se nějak ověří (třeba heslem) a vytvoří se pro
něj databázové spojení
- Uživatel "Pepa" pracuje s databází. Databáze neví, že je to
"Pepa". Bylo jí prostě řečeno, že ten člověk má správné přihlašovací
údaje, tak s ním "mluví".
- Mezitím se přihlásí "Jarda". Klidně s jiným heslem.
- Nyní pracují oba s databází. Databáze neví, že to jsou dva různí
uživatelé, a i kdyby to věděla, je jí to srdečně jedno.
- V nějaké chvíli se jeden a později druhý uživatel odhlásí.
Vrstva, ve které musíte uživatele rozlišit tedy není MySQL, ale PHP.
Zda a jak vyřešíte přihlašování je zcela ve Vašich rukou. Může to být
provedeno bezpečně, nebo to může být "děravé" jako ementál.
Pozn.: O těchto věcech ještě bude v
seriálu řeč.
Kde mít databázi
Ani tohle většinou nebudete moci ovlivnit. V naprosté většině
případů bude databáze ležet někde u providera a tudíž nebudete moci
účinně kontrolovat, kdo a kdy z ní četl vaše data. Jiná možnost je mít
vlastní databázový a/nebo webový server, což může být nákladné a
technicky náročné. Poskytovatel z vašich peněz žije, takže je zřejmě
ten poslední, kdo by chtěl zpronevěřit vaše data. Dojde-li k prozrazení
dat z datábáze uložené u webhostera, je to prakticky vždy způsobeno
útokem zvenčí, málokdy zevnitř.
Pozn.: Což je sice objektivní,
nikoli však uklidňující tvrzení. Jestliže si provider neumí zabezpečit
server
proti útoku na databázi, je potřeba ho nemilosrdně vyměnit.
Když běží databáze na jiném stroji než webový server musí spolu
pochopitelně komunikovat. V takovém případě byste
měli vědět, že:
- Přihlašovací informace si MySQL server s PHP bude vyměňovat
šifrovaně,
- vlastní data si bude vyměňovat komprimovaně, ale nešifrovaně.
V takovém případě by tedy kdokoli mezi databázovým a webovým
serverem mohl data odposlouchávat. Řešením je v tomto případě
zabezpečit přenos dat. To už
je mimo náplň našeho seriálu, ale v případě vzdálené komunikace mezi
MySQL a webovým serverem je to téměř nezbytné.
Co mít v databázi?
To je na první pohlad divná otázka. V databázi přece musíme mít ty
věci, které tam potřebujeme mít, ne? Ne tak docela. Některé věci se do
databáze mohou ukládat tak, aby to případnému zloději dat nic neříkalo.
Například chceme-li ukládat citlivé informace (hesla...) můžeme použít
funkci MD5. Příkaz:
SELECT MD5('petr')
vrátí nějaký řetězec, který případnému útočníkovi nic neřekne.
Šifrovacích a souvisejících funkcí podporuje MySQL celou
řadu. Pozor, některé jsou obousměnrné, některé jednosměrné.
Samozřejmě nezvítězíte, pokud se rozhodnete v databázi zašifrovat
kdejakou informaci. Pamatujte, že šifrování způsobí následující
problémy:
- Budete potřebovat více místa v databázi, protože šifrovaná data
jsou většinou delší než nešifrovaná.
- Budete potřebovat větší výpočetní výkon - například databáze bude
muset data dešifrovat a teprve potom řadit.
- Jestliže se někdo nepovolaný dostane jak k vaší databázi, tak k
PHP skriptům, je obyčejně každé zabezpeční téměř jistě prolomeno. Výjimkou
mohou být situace, kdy data závisí kromě údajů v samotných php
souborech ještě na něčem (třeba: informace
potřebné k dešifrování jsou umístěna v úložišti, které útočník
neprolomil).
Článku chybí nějaká praktická ukázka. Pakliže uložíte databázi
následující příkaz:
SELECT
AES_ENCRYPT("Super tajná informace","super tajný klíč")
uvidíte ve výsledku jen "rozsypaný čaj". Pokud zvolíte obrácený
postup, dostanete opět Vaši super tajnou informaci:
AES_DECRYPT(
AES_ENCRYPT( "Super tajná informace", "super tajný klíč"),
"super tajný klíč")
Jestliže se "super tajný klíč" bude nacházet mimo php skripty a
případný útočník jej nebude mít k dispozici, máte skoro vyhráno.
Protože prolomení šifer tohoto typu je velmi obtížné.
Pozn.: Informace uložené pomocí
šifrovacích funkcí budete muset
ukládat v polích pro binární data a ne v polích pro řetězce. To proto,
že výsledkem jsou binární (ne tedy textová) data.
Šifrování v PHP
Aby to PHP nebylo líto, dodejme, že i bez pomoci MySQL umí samotné
PHP informace (de)šifrovat. Pokud je to nastaveno, podporuje PHP
poměrně rozsáhlou škálu šifrovacích algoritmů.
Některé funkce (například md5()) jsou k
dispozici již v "základní výbavě" PHP. Nikdo Vám tedy nebrání ukládat
šifrovaná data do souborů nebo posílat je pomocí e-mailů a všechno to
dělat pomocí PHP.
Příště se zaměříme na veskrze praktické téma - budeme uvažovat nad
tím, jak do MySQL databáze nahrát data ze vzdálených zdrojů.
Verze pro tisk
|
Nejsou žádné diskuzní příspěvky u dané položky.
Příspívat do diskuze mohou pouze registrovaní uživatelé.
|
|
Vyhledávání software
Vyhledávání článků
28.11.2018 23:56 /František Kučera Prosincový sraz spolku OpenAlt se koná ve středu 5.12.2018 od 16:00 na adrese Zikova 1903/4, Praha 6. Tentokrát navštívíme organizaci CESNET. Na programu jsou dvě přednášky: Distribuované úložiště Ceph (Michal Strnad) a Plně šifrovaný disk na moderním systému (Ondřej Caletka). Následně se přesuneme do některé z nedalekých restaurací, kde budeme pokračovat v diskusi.
Komentářů: 1
12.11.2018 21:28 /Redakce Linuxsoft.cz 22. listopadu 2018 se koná v Praze na Karlově náměstí již pátý ročník konference s tématem Datová centra pro business, která nabídne odpovědi na aktuální a často řešené otázky: Jaké jsou aktuální trendy v oblasti datových center a jak je optimálně využít pro vlastní prospěch? Jak si zajistit odpovídající služby datových center? Podle jakých kritérií vybírat dodavatele služeb? Jak volit vhodné součásti infrastruktury při budování či rozšiřování vlastního datového centra? Jak efektivně datové centrum spravovat? Jak co nejlépe eliminovat možná rizika? apod. Příznivci LinuxSoftu mohou při registraci uplatnit kód LIN350, který jim přinese zvýhodněné vstupné s 50% slevou.
Přidat komentář
6.11.2018 2:04 /František Kučera Říjnový pražský sraz spolku OpenAlt se koná v listopadu – již tento čtvrtek – 8. 11. 2018 od 18:00 v Radegastovně Perón (Stroupežnického 20, Praha 5). Tentokrát bez oficiální přednášky, ale zato s dobrým jídlem a pivem – volná diskuse na téma umění a technologie, IoT, CNC, svobodný software, hardware a další hračky.
Přidat komentář
4.10.2018 21:30 /Ondřej Čečák LinuxDays 2018 již tento víkend, registrace je otevřená.
Přidat komentář
18.9.2018 23:30 /František Kučera Zářijový pražský sraz spolku OpenAlt se koná již tento čtvrtek – 20. 9. 2018 od 18:00 v Radegastovně Perón (Stroupežnického 20, Praha 5). Tentokrát bez oficiální přednášky, ale zato s dobrým jídlem a pivem – volná diskuse na téma IoT, CNC, svobodný software, hardware a další hračky.
Přidat komentář
9.9.2018 14:15 /Redakce Linuxsoft.cz 20.9.2018 proběhne v pražském Kongresovém centru Vavruška konference Mobilní řešení pro business.
Návštěvníci si vyslechnou mimo jiné přednášky na témata: Nejdůležitější aktuální trendy v oblasti mobilních technologií, správa a zabezpečení mobilních zařízení ve firmách, jak mobilně přistupovat k informačnímu systému firmy, kdy se vyplatí používat odolná mobilní zařízení nebo jak zabezpečit mobilní komunikaci.
Přidat komentář
12.8.2018 16:58 /František Kučera Srpnový pražský sraz spolku OpenAlt se koná ve čtvrtek – 16. 8. 2018 od 19:00 v Kavárně Ideál (Sázavská 30, Praha), kde máme rezervovaný salonek. Tentokrát jsou tématem srazu databáze prezentaci svého projektu si pro nás připravil Standa Dzik. Dále bude prostor, abychom probrali nápady na využití IoT a sítě The Things Network, případně další témata.
Přidat komentář
16.7.2018 1:05 /František Kučera Červencový pražský sraz spolku OpenAlt se koná již tento čtvrtek – 19. 7. 2018 od 18:00 v Kavárně Ideál (Sázavská 30, Praha), kde máme rezervovaný salonek. Tentokrát bude přednáška na téma: automatizační nástroj Ansible, kterou si připravil Martin Vicián.
Přidat komentář
Více ...
Přidat zprávičku
Poslední diskuze
31.7.2023 14:13 /
Linda Graham iPhone Services
30.11.2022 9:32 /
Kyle McDermott Hosting download unavailable
13.12.2018 10:57 /
Jan Mareš Re: zavináč
2.12.2018 23:56 /
František Kučera Sraz
5.10.2018 17:12 /
Jakub Kuljovsky Re: Jaký kurz a software by jste doporučili pro začínajcího kodéra?
Více ...
|