Seriál o internetovém obchodě v PHP jsme již jednou začali. Objevila se ale řada vašich připomínek, a tak jsme požádali autora seriálu o jejich zapracování. Dnes tedy vychází aktualizovaný první díl, abyste měli možnost jít novou cestou hned od počátku.

V následujícím seriálu se vám pokusím přiblížit internetový obchod, který jsem vytvořil pro prodej CD nosičů. Při tvorbě obchodu jsem se snažil myslet na to, aby si uživatel mohl CD pohodlně vybrat a následně objednat a přitom byla zachována jeho maximální bezpečnost. Jednotlivé aspekty jsem rozdělil do čtyř podkapitol, ve kterých se o konkrétním problému a jeho řešení dozvíte více.

Přehlednost a základní údaje

Každé CD má v databázi v tabulce assortment své údaje: identifikátor – ‚id‘, jméno interpreta – ‚artist‘, název – ‚name‘, stručný popis – ‚descript‘, kategorii do níž náleží – ‚cate‘, cenu – ‚price‘, počet zbývajících kusů k prodeji – ‚remain‘, počet prodaných kusů od začátku prodeje zboží – ‚saled‘, čas značící, od kdy dané CD prodáváme – ‚sale_time‘ a ve speciálním adresáři na disku také obrázek. Kvůli snadnému výběru jsou CD dělena na několik základních kategorií (žánrů) a podkategorií, jejichž hloubka zanoření je vzhledem k základním kategoriím prakticky neomezená. Administrátor internetového obchodu si také může vše libovolně spravovat, kategorie jsou totiž přehledně usporádány v databázové tabulce category s poli ‚id‘, které udává id kategorie, ‚parent‘ ve kterém nalezneme „rodiče“ (nadřazenou kategorii) dané kategorie a ‚title‘, značící jméno kategorie. Odtud si je celý e-shop v případě potřeby načítá. Pokud chce uživatel najít konkrétní CD, je mu poskytnuta možnost hledání určitého výrazu, který e-shop hledá v autorovi, názvu CD a také v jeho popisu. Možné je i rozšířené hledání, kde si uživatel může nadefinovat dotaz pomocí mnoha různých kritérií. Při výpisu jsou CD vypisována do tabulky, ve které jsou u každého kusu následující údaje: objednací číslo (též id), jméno interpreta + název CD a cena. Chce-li uživatel vědět více, může si kliknou na kterýkoli název, čímž otevře nové okno prohlížeče, ve kterém budou všechny informace o CD včetně jeho popisu a obrázku. Posledním kritériem při vyhledávání je počet zobrazených CD na stránce, který si uživatel může samozřejmě také nastavit. Máme-li více výsledků, než je nám dovoleno zobrazit, vypíšeme pod tabulku s CD nosiči seznam s čísly stránek, takže uživatel bude moci výsledky snadno stránkovat.

Zpracování objednávky

Během vyhledávání si uživatel může CD pohodlně vkládat do nákupního košíku, který si může kdykoli prohlédnout. CD budou v tom případě vypisována podobně, jako při vyhledávání, pouze s jedním patrným rozdílem – v tabulce je ještě navíc sloupec s počtem kusů (ten také může uživatel měnit přímo na stránce bez jakéhokoli zbytečného klikání). Samozřejmostí je možnost odstranění CD z košíku. Rozhodne-li se uživatel nákup ukončit, stačí mu jen vypsat své osobní údaje (jméno, adresa, e-mail a další), případně vyplnit své uživatelské jméno a heslo, je-li registrován, a jeho objednávka bude uložena do databázové tabulky orders s těmito údaji: id objednávky – ‚id‘, uživatelovo id (vyplní se pouze v případě, že uživatel je registrován a tuto registraci použil při vyplňování adresy) – ‚uid‘, adresa nakupujícího (není-li uživatel registrován) – ‚address‘, informace, byla-li objednávka již zaplacena – ‚payed‘ a typ dopravy, který si uživatel přeje pro dopravení své objednávky použít – ‚transport‘.

Registrovaní uživatelé

E-shop nabízí uživatelům, které stále nebaví ručně vypisovat svou adresu a kontaktní údaje, možnost registrace. V e-shopu se následně mohou přihlásit a objednávka je potom automaticky odesílána na adresu zadanou při registraci.

V databázi má registrace podobu tabulky reg_users s poli ‚id‘ – id uživatele, ‚name‘ – jméno a příjmení uživatele, ‚pass‘ – heslo uživatele zakódováno metodou MD5, ‚email‘ – e-mail, ‚address‘ – adresa, ‚tel‘ – telefon, ‚transport‘ – druh transportu zboží k uživateli.

Rozlišování uživatelů

Každý uživatel při vstupu do obchodu dostane svůj vlastní session identifikátor, pomocí kterého je po celou dobu nákupu oddělován od ostatních nakupujících. Tento session identifikátor (‚sessid‘) je uložen v databázové tabulce users spolu s uživatelovou ip adresou (‚ip‘), některými údaji z jeho PC (‚client_pc‘), autorizačním klíčem (‚auth_key‘) a časem (‚time‘), kdy byla session naposledy použita.

Při vložení prvního CD do košíku se v tabulce bags s poli session identifikátor (‚sessid‘), číslo objednávky (bude vyplněno jen pokud byl nákup ukončen a odeslán) – ‚ordid‘, id položky (‚article‘) a počet kusů položky (‚count_article‘) vytvoří nový záznam, který se po dobu nákupu bude chovat jako položka v nákupním košíku.

Poslední tabulkou je support, která po celou dobu nákupu bude obsahovat pouze jeden sloupec ‚deltime‘ a jediný záznam. Hodnota tohoto sloupce bude obsahovat čas, kdy se má provést další mazání přebytečných nákupních košíků a záznamů o uživatelích, kteří během nákupu odešli (od posledního použití session uplynulo alespoň 30 minut).

Bezpečnost

Bezpečnost e-shopu byl jeden z hlavních bodů, kterými jsem se při tvorbě obchodu zabýval. Proto jsou všechny proměnné, se kterými skript nějak pracuje, ošetřeny podle toho, jaký typ dat od nich očekáváme. Předpokládáme-li, že proměnná bude typ integer nebo double, jednoduše ji na začátku skriptu vynásobíme „1“, má-li být typu string, ověříme pomocí get_magic_quotes_gpc(), zda je „obohacena“ zpětnými lomítky, v případě potřeby je odstraníme pomocí stripslashes(), a dále ji pak převádíme podle toho, co s ní právě chceme dělat – pokud ji přidáváme do sql dotazu, převedeme ji pomocí funkce escapeshellcmd(), pokud do HTML kódu, tak pomocí htmlspecialchars().

Hlavní aspekt bezpečnosti byla však obrana proti session-stealingu, tedy proti zcizení session. Všímaví čtenáři již podle sloupců tabulky users ví, že se před tímto druhem útoku bráníme hned třemi způsoby. První z nich je ověřování IP adresy klienta, přičemž kontrolujeme co nejvíce informací, abychom omezili selhání kontroly vinou proxy serverů. Dalším kritériem je kontrola prohlížeče a operačního systému klienta a poslední, dle mého názoru však nejspolehlivější, je autorizační klíč.

Autorizační klíč vygenerujeme z počtu milisekund aktuálního času a zakódujeme pomocí metody MD5. Při prvním vstupu do obchodu je uživatel ihned přesměrován na tutéž stránku, ale již se session identifikátorem a autorizačním klíčem uloženým do session proměnné. V tu dobu je již autorizační klíč uložen v databázi. Při každé návštěvě stránky jej (spolu s IP adresou, klientem a OS uživatele) zkontrolujeme, zdali souhlasí se záznamem v databázi. Pokud ano, ze starého klíče vygenerujeme nový a přepíšeme jím starý v databázi. Síla autorizačního klíče je tedy v tom, že je na každé stránce jiný, v praxi neodvoditelný.

První, veskrze teoretický díl seriálu o internetovém obchodu máme konečně za sebou. Doufám, že vás dokonale neuspal a že vám zůstaly síly aspoň na to, abyste si ho sami zkusili.

Pozn. red.: Seriál musel být předčasně ukončen, protože autor nedodal slíbená pokračování. Máte-li zájem v seriálu pokračovat vlastními články, prosíme, kontaktujte redakci.

Starší komentáře ke článku

Pokud máte zájem o starší komentáře k tomuto článku, naleznete je zde.

Žádný příspěvek v diskuzi

Odpovědět