České vysoké učení technické v Praze Fakulta elektrotechnická
Bakalářská práce
Specializovaný redakční systém pro ekonomický portál Jan Zikán
Vedoucí práce: Ing. Michal Valenta, Ph.D.
Studijní program: Informatika a výpočetní technika červenec 2006
ii
Poděkování Rád bych tou to cestou poděkoval Janu Fialovi, autorovi skvělého freeware editoru PSPad, který se pro mě stal nenahraditelným nástrojem při vytváření webových stránek.
iii
iv
Prohlášení Prohlašuji, že jsem svou bakalářskou práci vypracoval samostatně a použil jsem pouze podklady uvedené v přiloženém seznamu. Nemám závažný důvod proti užití tohoto školního díla ve smyslu §60 Zákona č. 121/2000 Sb., o právu autorském, o právech souvisejících s právem autorským a o změně některých zákonů (autorský zákon).
V Praze dne 18.6.2006
……………………………………………………………..
v
vi
Abstract This work represents results of creation of content management system for specialized economic portal, which also includes discussion forum.
Abstrakt Tato práce prezentuje výsledky tvorby redakčního systému pro specializovaný ekonomický portál, který taktéž zahrnuje diskusní fórum.
vii
viii
Obsah Seznam obrázků .........................................................................................xi Seznam tabulek.........................................................................................xiii 1. 2.
Úvod ................................................................................................... 1 Popis problému ................................................................................. 1
2.1 2.1.1 2.1.2 2.1.3 2.1.4 2.1.5 2.1.6 2.1.7 2.2 2.2.1 2.2.2 2.2.3 2.2.4 2.2.5 2.2.6 2.2.7 2.3 2.3.1 2.3.2 2.3.3 2.3.4
Vymezení cílů ...................................................................................................... 1 Využitelnost ...................................................................................................... 1 Rozšiřitelnost .................................................................................................... 1 Vzhled a design................................................................................................. 1 Přístupnost ........................................................................................................ 2 Zabezpečení ...................................................................................................... 2 Další hlediska.................................................................................................... 2 Konkrétní požadavky na funkce systému ......................................................... 3 Struktura systému............................................................................................... 3 HTML ............................................................................................................... 3 HTTP ................................................................................................................ 3 Webový server .................................................................................................. 4 Komunikace mezi klientem a serverem............................................................ 4 Dynamické vytváření stránek ........................................................................... 4 Datová vrstva serveru ....................................................................................... 4 Souhrn............................................................................................................... 5 Existující implementace ..................................................................................... 5 Joomla............................................................................................................... 6 PHP-Nuke ......................................................................................................... 6 phpRS................................................................................................................ 7 Konečné zhodnocení......................................................................................... 7
3.
Analýza............................................................................................... 8
3.1 Možnosti systému ................................................................................................ 9 3.1.1 Uživatelské role ................................................................................................ 9 3.2 Datový model..................................................................................................... 10 3.3 Jazyk pro tvorbu dynamických stránek ......................................................... 10 3.3.1 CGI skripty ..................................................................................................... 10 3.3.2 ASP ................................................................................................................. 11 3.3.3 PHP ................................................................................................................. 11 3.4 Webový server................................................................................................... 12 3.4.1 IIS.................................................................................................................... 13 3.4.2 Apache ............................................................................................................ 13 3.5 Databáze ............................................................................................................ 13 3.5.1 Oracle.............................................................................................................. 14 3.5.2 Microsoft SQL Server..................................................................................... 14 3.5.3 Microsoft Access ............................................................................................ 14 3.5.4 PostgreSQL..................................................................................................... 14 3.5.5 MySQL ........................................................................................................... 14 3.5.6 Zhodnocení ..................................................................................................... 15 3.6 Skriptovací jazyk na klientské straně ............................................................. 16 3.7 Formát generovaných dokumentů a definice vzhledu................................... 16 3.7.1 XML................................................................................................................ 17
ix
3.7.2 3.7.3 3.7.4 3.8 3.8.1 3.8.2 3.8.3
XHTML...........................................................................................................17 CSS..................................................................................................................17 DHTML...........................................................................................................18 Kódování ............................................................................................................19 Znaková sada...................................................................................................19 Unicode ...........................................................................................................19 UTF-8 ..............................................................................................................19
4.
Návrh řešení.....................................................................................20
4.1 4.2 4.3 4.3.1 4.3.2 4.3.3 4.4
Struktura databáze ...........................................................................................20 Struktura systému .............................................................................................21 Navigace .............................................................................................................21 Cookies............................................................................................................21 Přenos informací jako parametry v URL ........................................................22 Sessions ...........................................................................................................22 Tvorba formulářů .............................................................................................22
5.
Realizace ..........................................................................................23
5.1 5.1.1 5.1.2 5.1.3 5.1.4
Zabezpečení........................................................................................................24 Speciální znaky ...............................................................................................24 SQL injection ..................................................................................................24 Vícenásobné odeslání formuláře .....................................................................25 Komentářový spam .........................................................................................25
6. 7. 8.
Testování ..........................................................................................26 Závěr.................................................................................................27 Seznam literatury............................................................................29
A B C D E
Seznam použitých zkratek .............................................................31 Relační model databáze..................................................................32 Instalační příručka..........................................................................33 Uživatelská příručka.......................................................................34 Obsah přiloženého CD....................................................................41
x
Seznam obrázků Obr. 2.2.1 – Průběh komunikace mezi prohlížečem a WWW serverem .......................... 4 Obr. 2.2.2 – Architektura dynamického webu.................................................................. 5 Obr. 3.7.1 – Druhy jazyků HTML a XHTML ................................................................ 17 Obr. 3.7.2 – DHTML – použité technologie................................................................... 18 Příloha Obr. 1 – Relační model databáze ....................................................................... 32 Příloha Obr. 2 – Hlavní stránka redakčního systému – uživatel nepřihlášen ................. 34 Příloha Obr. 3 – Hlavní stránka redakčního systému – uživatel přihlášen ..................... 35 Příloha Obr. 4 – Výpis článků autora ............................................................................. 35 Příloha Obr. 5 – Zobrazení článku.................................................................................. 36 Příloha Obr. 6 – Vložení článku do redakčního systému ............................................... 36 Příloha Obr. 7 – Hlavní stránka diskusního fóra – uživatel přihlášen ............................ 37 Příloha Obr. 8 – Výpis podkategorií a témat zvolené kategorie ..................................... 37 Příloha Obr. 9 – Výpis příspěvků ................................................................................... 38 Příloha Obr. 10 – Profil uživatele ................................................................................... 38 Příloha Obr. 11 – Vložení příspěvku .............................................................................. 39 Příloha Obr. 12 – Registrace uživatele ........................................................................... 39 Příloha Obr. 13 – Nastavení přístupového hesla............................................................. 40 Příloha Obr. 14 – Nastavení osobních údajů uživatele................................................... 40
xi
xii
Seznam tabulek Tabulka 3.1.1 – Přehled uživatelských rolí a přidělených práv........................................ 9
xiii
1. Úvod Cílem mé bakalářské práce bylo vytvořit redakční systém pro specializovaný ekonomický portál, jehož součástí je také diskusní fórum. Po důkladném zvážení úkolu jsem se rozhodl pro obecnější řešení - vytvoření komplexního systému, jehož specializace by byla dána jeho obsahem a specifické funkce, dle konkrétních požadavků, by do něj byly přidávány formou modulů. Implementace systému bude prvotně využita pro prezentaci informací a článků z oblasti ekonomie.
2. Popis problému 2.1
Vymezení cílů
K cílům práce jsem přistupoval z několika hledisek: • • • • • • •
Využitelnost Rozšiřitelnost Vzhled a design Přístupnost Zabezpečení Další hlediska Konkrétní požadavky
2.1.1 Využitelnost Redakční systém a přidružené diskusní fórum by měli vytvářet celistvý systém, který by mohl být využit na různých portálech se specifickým zaměřením. O obsah webového portálu by se měli starat samotní uživatelé, kteří budou rozčleněni do hierarchie dle přidělených práv pro práci se systémem a jeho částmi. Z hlediska možného využití systému na cizojazyčných či vícejazyčných portálech by měl systém umožnit zobrazení dat v různých jazycích ve správném nezkresleném tvaru. 2.1.2 Rozšiřitelnost Vzhledem k zamýšlené obecnosti a využitelnosti systému na portálech s různým zaměřením by měl být systém navržen tak, aby mohl dle požadavků a záměrů provozovatelů portálů být případně doplněn o další funkce, které v něm nejsou obsaženy. 2.1.3 Vzhled a design Každý provozovatel webových stránek má jinou představu o jejich vzhledu a designu. Vzhledem je myšlena třeba barevná skladba stránek, použité druhy písma, zarovnání, ale i rozložení jednotlivých elementů stránek – prostě vše co nespadá do obsahu. Z tohoto důvodu by měl být výsledný systém koncipován tak, aby byl obsah stránek důsledně oddělen od jejich formy. Tak bude možné měnit vzhled stránek dle představ provozovatele, aniž by byl ovlivněn obsah. Změna vzhledu stránek, ať už nepatrná či razantní by měla být snadno proveditelná. Vzhledem k plánované využitelnosti systému na portálech s různým zaměřením, nabývá možnost snadné modifikace designu stránek ještě většího významu. 1
2.1.4 Přístupnost Webové stránky by měly být vytvářeny s úmyslem, že spolu s kvalitním obsahem se bude jejich návštěvnost pravděpodobně zvyšovat. Mnohé internetové portály získávají své finanční prostředky zobrazováním reklam, a proto je vysoká návštěvnost jejich prioritou. Za kvalitní obsah, který by měl návštěvníky přilákat, mnohdy provozovatelé platí nemalé peníze. Velký důraz by při vytváření systému měl být kladen na zpřístupnění obsahu co největšímu počtu lidí. Při prohlížení obsahu webových stránek by neměli být jejich návštěvníci nijak znevýhodňováni – ať už z hlediska softwaru, který k zobrazení stránek používají (Internet Explorer, FireFox apod.), platformy na které si stránky prohlížejí nebo z hlediska jiných specifických potřeb. Znevýhodněni by neměli být návštěvníci při přístupu k informačnímu obsahu portálu ani rychlostí svého připojení k internetu. Čím širšímu okruhu lidí stránky zpřístupníme a poskytneme jim při prohlížení jejich obsahu určitý komfort, tím více lidí se bude na naše stránky vracet. Komfort při prohlížení stránek představuje především možnost rychlého nalezení informací, které návštěvník hledá, s čímž souvisí snadná navigace a orientace v systému, ale i možnost přizpůsobit si vzhled stránek tak, aby návštěvníkovi co nejvíce vyhovoval (např. zvětšení písma pro slabozraké), aniž by byl narušen layout stránek – rozložení elementů stránky. Je zřejmé, že není možné se při vytváření stránek zavděčit všem. Je proto nutné zvolit správnou rovnováhu mezi vzhledem stránek a jejich přístupností co možná největšímu počtu návštěvníků. S přístupností webových stránek souvisí také jejich validita – tzn. dodržení standardů. Psaní validního kódu nám poskytuje záruku, že se stránky zobrazí správně ve všech prohlížečích vyhovujících webovým standardům. Vytvořený systém by měl z hlediska přístupnosti podporovat: • • • •
Správné zobrazení stránek v nejpoužívanějších prohlížečích – Internet Explorer, FireFox (prohlížeče pracující na jádře Gecko), Opera – validita stránek Snadnou navigaci v systému stránek Rychlost načítání stránek Variabilitu zobrazení stránek bez narušení designu
2.1.5 Zabezpečení Zabezpečení redakčního systému a diskusního fóra proti útokům z vnějšku by mělo být jedním z důležitých cílů této práce, přičemž běžný uživatel přistupující k obsahu stránek, by si neměl bezpečnostních mechanismů ani všimnout. Zabezpečení by mělo zahrnovat kontrolu vstupních údajů vkládaných do systému, přidělení práv pro práci se systémem a jeho částmi. Důležitým bezpečnostním prvkem by měla být ochrana proti spamu – nevyžádanému masově šířenému sdělení. 2.1.6 Další hlediska Do této kategorie cílů práce bych zahrnul systematickou snahu o zvýšení návštěvnosti daného portálu pomocí SEO (Search Engine Optimalization) prostředků – optimalizace pro vyhledávače.
2
Pokud dosud neznámý webový portál nevynakládá prostředky k informování veřejnosti o své existenci (pomocí reklamy), je jen malá šance, že se potencionální návštěvník o daném portálu dozví. Jednou z možností jak může člověk dané stránky nalézt, je výsledek hledání klíčového slova či fráze vyhledávačem webových stránek, přičemž stránky vyhovující hledané frázi jsou řazeny sestupně dle určitého hodnocení (page ranking), které je dáno vnitřním algoritmem vyhledávače. Tento algoritmus se pro jednotlivé vyhledávače liší, ale v zásadě bere v potaz spjatost stránky s hledanou frází či slovem, důvěryhodnost obsahu stránek a jejich atraktivitu pro vyhledávač. Techniky pro zvýšení hodnocení stránek vyhledávačem se souhrnně nazývají SEO a jejich podstatou je správné strukturování dokumentů a odstranění nepodstatných částí kódu. 2.1.7 Konkrétní požadavky na funkce systému Systém by měl umožňovat: • • • • •
2.2
Diferencovaný přístup uživatelů do systému pomocí uživatelského jména a hesla Udělení různých práv uživatelům pro práci se systémem – vytvoření hierarchie dle přidělených práv Registraci nových uživatelů Vkládání článků a komentářů do redakčního systému Vkládání příspěvků do diskusního fóra
Struktura systému
Při vytváření redakčního systému je důležité vzít v potaz, že je aplikován na portály, jejichž obsah je často aktualizován a časem se rozrůstá. Takový systém nemůže být tvořen statickými stránkami, protože při každé změně obsahu by bylo nutné přepsat jejich zdrojový kód. Systém, jehož obsah je proměnlivý v čase musí být interaktivní a tedy pružně reagovat na požadavky uživatelů. Abych mohl lépe definovat strukturu systému a proces, kterým jsou stránky dynamicky vytvářeny, měl bych předtím přistoupit k vysvětlení několika pojmů. 2.2.1 HTML Jazyk HTML (Hypertext Markup Language) byl prvním jazykem pro vytváření stránek, který se vyvinul z univerzálního jazyka SGML (Standard Generalized Markup Language). Vývoj jazyka HTML byl ovlivněn vývojem webových prohlížečů. Dnes existuje ve verzi 4.01, ale postupně je nahrazován novějším jazykem XHTML (Extensive Hypertext Markup Language), který klade důraz na oddělení obsahu stránek od jejich formy. 2.2.2 HTTP Protokol HTTP (Hypertext Transfer Protocol) byl původně určen pro přenos hypertextových dokumentů ve formátu HTML, ale v současné době s ním lze přenášet jakýkoli soubor. Ke specifikaci jednoznačného umístění dokumentů na internetu využívá jednotného lokátoru zdrojů URL (Uniform Resource Locator) – řetězec znaků s definovanou strukturou. URL definuje doménovou adresu serveru, umístění dokumentu na serveru, protokol pro přístup k souboru a parametry.
3
2.2.3 Webový server Webový server nebo také WWW server je počítač nebo počítačový program, který vyřizuje požadavky ve formě HTTP ze strany klienta. Vyřízením požadavku se rozumí odeslání požadovaných dat (např. dokumentu HTML) klientovi (prohlížeči). 2.2.4 Komunikace mezi klientem a serverem Protokol HTTP funguje na bázi dotaz-odpověď. Uživatel pomocí internetového prohlížeče (klientská strana) zašle serveru dotaz jako čistý text, který obsahuje označení požadovaného dokumentu ve formě URL, informace o prohlížeči apod. Server následně odpoví pomocí několika řádků textu popisujících výsledek dotazu (zda se dokument podařilo najít, typ dokumentu), za kterými následují samotná data požadovaného dokumentu (např. dokument HTML) .
Obr. 2.2.1 – Průběh komunikace mezi prohlížečem a WWW serverem
2.2.5 Dynamické vytváření stránek Stránka ve formátu (X)HTML je soubor uložený na disku WWW serveru. Takto předem připravené stránky nazýváme statickým obsahem serveru a klientovi jsou poskytnuty beze změny. Každá stránka má své unikátní URL. Je však možné aby URL odkazovalo na skript, kterým může být výsledná stránka dynamicky generována. Skript je zpracován na straně serveru a klientovi (prohlížeči) je poskytnut výsledný dokument (X)HTML, který může obsahovat aktuální informace (dynamický obsah). K dynamickému vytváření obsahu se používá řada technologií, kterým se budu věnovat v analytické části při výběru implementačních prostředků. Statický obsah je server klientovi schopen poskytnout výrazně rychleji než dynamický. Pomocí dynamického obsahu je však možné pružně poskytovat větší množství informací dle daných požadavků. 2.2.6 Datová vrstva serveru Informační obsah systému a informace o uživatelích a jejich nastavení jsou u dynamicky vytvářených stránek uloženy v datové vrstvě serveru. Data mohou být jednoduše uložena v souborech, ale v dnešní době se pro ukládání dat a práci s nimi nejčastěji využívá databází pracujících na databázových serverech, které poskytují řadu výhod, mezi něž patří snadné zabezpečení dat a přidělení práv pro manipulaci s nimi. Při práci s daty uloženými v souborech je nutné řešit problém kolizí, které mohou nastat při vícenásobném přístupu k souborům (při zápisu). Databáze zajišťuje atomicitu transakcí (souboru operací) automaticky, což znamená že daná činnost se provede najednou a nemůže být přerušena a dokončena později. Transakce A může nastat před transakcí B nebo až po ní, ale nemohou probíhat současně. Ve skutečnosti transakce současně probíhají, ale synchronizace provedená databázovým serverem zajišťuje, že 4
databáze bude vypadat, jako kdyby transakce proběhly postupně. Pokud není soubor operací možné provést, provede databáze rollback – návrat do původního stavu před provedením transakce. Velkou výhodou relačních databází (databázových systémů založených na relačním modelu dat a relační algebře) je dotazovací jazyk SQL (Structured Query Language). Problematika relačních databází a jazyka SQL je velice dobře popsána ve skriptech pro předmět Databázové systémy [3].
Obr. 2.2.2 – Architektura dynamického webu
2.2.7 Souhrn Základem redakčního systému a diskusního fóra je soubor technických prostředků na straně serveru - databáze obsahující samotný obsah systému a skripty, které z těchto dat automaticky generují stránky ve formátu (X)HTML s daným obsahem, dle požadavků uživatelů. Z hlediska zmenšení zatížení webového serveru jsou součástí systému i skripty na klientské straně, které řeší požadavky uživatelů aniž by je zasílali serveru. Tyto skripty nemohou přistupovat k datům uloženým v databázi. Mohou ale kupříkladu kontrolovat správnost vstupních údajů od uživatelů, před jejich vložením do databáze. Realizací projektu spočívajícího ve spolupráci s databází, skripty automaticky generujícími stránky dle požadavků uživatelů na straně serveru a skripty kontrolujícími vstupní data před jejich odesláním serveru získáme obecně použitelný systém, který může být využit na různých portálech a zároveň splňuje naše vytyčené cíle.
2.3
Existující implementace
Pro každý větší portál, jehož obsah je často aktualizován, je redakční systém dobrým a elegantním řešením. Při změně obsahu stránek se jejich provozovatel nemusí starat o úpravu jejich zdrojového kódu. Jeho jedinou starostí pak tedy zůstává obstarávání kvalitního obsahu, který by návštěvníkům poskytnul. Vytvoření redakčního systému pro daný portál může být velice nákladná záležitost. Existuje však množství již hotových řešení, které může provozovatel pro své potřeby
5
využít zdarma. Nabízená řešení se velmi liší svou kvalitou a množstvím poskytovaných funkcí. Rád bych se zde zmínil o nejpoužívanějších a nejlépe hodnocených redakčních systémech, které jsou v dnešní době využívány. Zaměřil jsem se především na systémy šířené pod OSS (open-source software) licencí, což znamená, že je daný systém nejen dostupný zdarma, ale jeho zdrojové kódy je možno i prohlížet a upravovat. 2.3.1 Joomla Jedná se o velice rozšířený CMS (content management system) – redakční systém, který díky svým kvalitám už po světě získal řadu ocenění. Systém je napsán v jazyce PHP (PHP Hypertext Preprocesor) a využívá databázi MySQL. Systém Joomla je v dnešní době k dispozici ve verzi 1.0.1.0, ale dle vývojového plánu by verze 2.0 měla být kompletně přepsána do jazyka PHP 5. Joomla je komplexní systém, který nabízí množství funkcí. S jeho pomocí lze vytvářet jednoduché dynamické stránky, ale i rozsáhlé portály. Jeho dalšími výhodami jsou: • • • • •
Snadná instalace Práce se systémem nevyžadující znalost jazyků pro vytváření webových stránek Flexibilita Elegantní design Možnost rozšíření o další funkce
Ačkoliv se jedná o velice vydařený redakční systém, může jeho množství různých nastavení a funkcí některé uživatele odradit. Velké množství funkcí, které jsou v systému dostupné také určitě nevyužije každý. Autoři na domovských stránkách tohoto produktu inzerují jednoduchost změny vzhledu stránek a jejich layoutu, avšak není to tak úplně pravda. Vzhled stránek je zčásti tvořen pomocí tabulek v kódu stránek, takže při snaze o razantnější změnu vzhledu je nutné zasáhnout do zdrojového kódu, což vyžaduje určitou znalost XHTML, v němž jsou stránky napsány. Podmínkou správné funkčnosti systému je zapnutý JavaScript na klientské straně. Dalo by se říci, že tato výtka je spíše malicherná, protože většina moderních prohlížečů má JavaScript implicitně zapnutý, bez jeho zapnutí je však systém téměř nefunkční a neovladatelný. Výše vyjmenované nedostatky redakčního systému Joomla jsou spíše vadami na kráse, které však mohou provozovatele portálu při výběru systému ovlivnit. 2.3.2 PHP-Nuke Redakční systém PHP-Nuke je koncipován jako modulární a snadno rozšiřitelný. Již ve své základní konfiguraci obsahuje množství modulů, které obstarávají rozmanité funkce. Ke svému provozu vyžaduje databázi SQL (doporučována je MySQL, na které byl systém testován), webový server Apache a programovací jazyk PHP verze 4.x, které jsou na internetu volně dostupné. Systém je lokalizován do více než 20 jazyků, mezi nimiž bohužel není čeština. Na českých portálech je však hojně využívaný systém „UNITED-NUKE“, který je z tohoto redakčního systému odvozen a který českou lokalizaci obsahuje. Kolem této modifikace původního systému se u nás vytvořila široká komunita uživatelů, která pro ní vytváří další funkce ve formě modulů. 6
Systém PHP-Nuke trpí neduhem mnoha redakčních systémů a tím je zastaralý způsob vytvoření vzhledu a rozložení prvků stránek pomocí tabulek. Změna vzhledu pak vyžaduje zásah do zdrojového kódu, který je v tomto případě napsán v HTML 4.01 a vyžaduje od uživatele již určité znalosti. Vzhled stránek také není vytvořen variabilně pro možnost jeho úpravy ze strany návštěvníka – např. při změně velikosti písma či změně rozlišení obrazovky se čitelnost obsahu stránek rapidně sníží. Stránky generované PHP ve většině případů obsahují syntaktické ale i sémantické chyby, které, ačkoliv nezpůsobují funkční problémy systému, mohou vést k chybnému zobrazení stránek v různých prohlížečích, jež chybný kód interpretují různým způsobem. Stránky byly testovány validátorem zdrojového kódu mezinárodního konsorcia W3C [1], jehož členové vyvíjejí webové standardy. 2.3.3 phpRS Redakční a informační systém phpRS je oproti předchozím dvěma systémům ryze českým produktem a mezi českými uživateli je velice oblíben. Stejně jako výše zmiňované systémy využívá skriptovacího jazyka PHP a databáze MySQL. Mezi hlavní rysy systému dle jeho autora patří: • • • • • •
Správa uživatelů – rozlišení mezi různými typy uživatelů a jejich přístupovými právy k systému Vzhled vytvářený pomocí šablon (bez nutnosti zasahovat do samotného kódu systému). Šablony lze mezi sebou kombinovat Rozšiřitelnost ve formě modulů a pluginů Sledování statistik návštěvnosti Reklamní management pro správu reklam Interní zálohovací subsystém umožňující zálohovat celou databázi
Je patrné, že tento systém oproti předchozím dvěma nenabízí téměř žádnou novou funkcionalitu. Důvodem jeho obliby mezi českými uživateli je především vstřícný přístup komunity podporující projekt, která kromě vytváření dalších rozšíření ve formě modulů také publikuje množství informací a rad, jak systém přizpůsobit specifickým požadavkům. Velkou výhodou může být pro mnohé uživatele, kteří chtějí systému nahlédnout pod kůži, srozumitelný kód s komentáři. Šablony pro vytváření vzhledu definují layout stránek stejně jako předchozí systémy pomocí tabulek v kódu stránek, čímž brání snadné modifikaci, ačkoli autoři ve svých záměrech tvrdí opak. Podobně jako u předchozího redakčního systému PHP-Nuke ani zde není kód výstupních stránek validní, čímž nezaručuje správné zobrazení stránek ve všech prohlížečích. 2.3.4 Konečné zhodnocení Volně dostupných redakčních systémů existuje celá řada, většina z nich je však určena pro méně rozsáhlé webové stránky nebo blogy (web logy – webové deníky). Výchozím bodem pro výběr správné alternativy redakčního systému pro specifické účely může být
7
stránka OpenSourceCMS [2], kde lze nalézt množství informací, odkazů a hodnocení uživatelů. Mezi nejčastější nevýhody nabízených systémů patří již zmiňovaná tvorba vzhledu pomocí tabulkových layoutů a nevalidita výsledného kódu. Většina nabízených řešení také nepočítá s aplikací pro vícejazyčné portály, na kterých mohou být použity různé znakové sady. Z hlediska mé práce téměř žádné řešení nenabízelo redakční systém spolu s diskusním fórem. Systémů vytvořených speciálně pro tvorbu diskusních fór je také mnoho (např. systém phpBB), ale bylo by pak zapotřebí využití více různých systémů, které by bylo třeba sjednotit. Množství systémů pro tvorbu diskusních fór lze najít na zmiňované stránce OpenSourceCMS [2].
3. Analýza V předchozí kapitole jsme si stanovili strukturu systému, které by se měla skládat ze dvou částí. Část na straně serveru obstarává dynamické generování stránek na základě požadavků klientů z dat uložených v datové vrstvě serveru tvořené databází. Druhá část systému na straně klienta by měla řešit požadavky klienta bez jejich odeslání serveru ke zpracování, což je mnohem rychlejší, ale skripty na klientské straně nemohou přistupovat k datům v datové vrstvě serveru. Před vlastní tvorbou projektu si musíme určit možnosti a schopnosti systému a vybrat konkrétní implementační prostředky, které pro vytvoření redakčního systému a přidruženého diskusního fóra použijeme. Z implementačních prostředků je třeba si zvolit: • • • • •
Skriptovací jazyk pro dynamické vytváření stránek a práci s daty Databázový server, který tvoří datovou vrstvu systému Webový server na kterém celý systém poběží a jehož vlastností může systém využívat Jazyk pro zpracování požadavků na klientské straně Formát výsledných dynamicky vytvářených dokumentů a způsob jakým v nich bude definován vzhled a design
Jedním z hlavních cílů práce byla využitelnost vytvořeného projektu i pro jiné portály se specifickým zaměřením. Aby se provozovatel webových stránek nemusel starat o záležitosti spojené s provozem serveru (vytíženost a možné výpadky), byl systém vytvářen s úmyslem umístění na serveru provozovaném třetí stranou. Třetí stranou zde rozumíme placené hostingové nebo free-hostingové služby, které poskytují prostor pro uložení obsahu dostupného přes internet na svých serverech za úplatu či zdarma. Hostingové služby zároveň poskytují garance zabezpečení proti možné ztrátě dat při výpadcích serveru. Množství a kvalita služeb poskytovaných hostingovými servery se velmi liší. Používaný webový server a platforma (operační systém) na které je server provozován určují, jaké prostředky k vytváření dynamických stránek může uživatel využít. Při výběru implementačních prostředků jsem dbal na to, aby bylo systém možno provozovat na co největším počtu hostingových a free-hostingových serverů, ale aby bylo možné systém provozovat bez velkých nákladů i na vlastním stroji.
8
3.1
Možnosti systému
Před samotnou realizací projektu je nutné si ujasnit, jaké schopnosti má implementovaný systém mít a jaké funkce má uživatelům poskytovat – od toho se odvíjí i datový model systému. Projekt zahrnuje redakční systém pro vkládání článků s možností reakce na daný článek formou komentáře a diskusní fórum s možností vkládání příspěvků do konkrétních diskusních témat. 3.1.1 Uživatelské role Důležitou vlastností systému je diferencovaný přístup uživatelů k systému a možnost manipulace s jeho obsahem dle přidělených práv. Pro tyto účely si definujeme uživatelské role: • • • • •
Návštěvník – neregistrovaný uživatel systému, který může číst obsah systému (články v redakčním systému a příspěvky v diskusním fóru), ale nemůže s ním manipulovat (může pouze vkládat komentáře ke článkům) Čtenář – registrovaný uživatel systému. V rámci redakčního systému má stejná práva jako návštěvník, navíc ale může přispívat do diskusního fóra Redaktor – registrovaný uživatel systému, který se může aktivně podílet na tvorbě obsahu systému vkládáním článků do redakčního systému. V rámci diskusního fóra má stejná práva jako čtenář. Moderátor – registrovaný uživatel systému, který se stará o správu diskusního fóra. Administrátor – registrovaný uživatel systému. Spravuje veškerý obsah systému. Má veškerá práva výše uvedených uživatelských rolí a může ostatním uživatelům práva přidělovat.
Uživatelská role Návštěvník Čtenář
Redaktor
Moderátor
Administrátor
Redakční systém - prohlíží články - vkládá komentáře ke článkům - prohlíží články - vkládá komentáře ke článkům
- prohlíží články - vkládá články - edituje své články (*) - vkládá komentáře ke článkům - prohlíží články - vkládá komentáře ke článkům
Diskusní fórum - prohlíží příspěvky - prohlíží příspěvky - vytváří příspěvky - upravuje své příspěvky - maže své příspěvky - prohlíží příspěvky - vytváří příspěvky - upravuje své příspěvky - maže své příspěvky - vytváří diskusní téma (*) - maže diskusní téma (*) - uzamyká / odemyká téma (*) - vytváří příspěvky - maže všechny příspěvky - upravuje své příspěvky
- veškerá práva předchozích rolí - přiděluje práva jednotlivým uživatelům (*) - vytváří rubriky článků (*) - vytváří kategorie témat (*) - maže rubriky článků (*) - maže kategorie témat (*)
Tabulka 3.1.1 – Přehled uživatelských rolí a přidělených práv – znakem * jsou v tabulce označeny funkce jež vzhledem k rozsáhlosti projektu nebyly zatím implementovány
9
Registrovaným uživatelem se rozumí uživatel, jemuž byl vytvořen uživatelský účet (s přihlašovacím jménem a heslem), vložením jeho údajů do databáze. Přidělená práva jednotlivým uživatelským rolím v rámci redakčního systému a diskusního fóra přehledně znázorňuje tabulka uživatelských rolí (viz. výše).
3.2
Datový model
Před vlastní specifikací struktury databáze je vhodné si strukturu dat a jejich vazeb popsat v určité obecné abstraktní rovině. Snahou je vytvořit strukturu dat, tvořenou objekty (entitami) a jejich vlastnostmi, vzájemnými vztahy mezi entitami a různými omezeními, tak aby návrh co nejvíce odpovídal reálnému světu. K objektům datového modelu přistupujeme jako k jednoznačně identifikovatelným objektům reálného světa. Datový model systému se skládá z entitních typů: • •
• • • •
3.3
Uživatelé (entitní typ UŽIVATEL) vytvářejí obsah systému. V rámci redakčního systému mohou redaktoři (uživatelská role je atribut uživatele) vkládat články (ČLÁNEK) – konkrétní článek může být do systému vložen pouze jedním redaktorem. Redaktor však zároveň nemusí do systému vkládat žádné články. Každý článek je zařazen do určité rubriky (RUBRIKA), přičemž může být zařazen pouze do jedné. Rubrika může obsahovat více článků, ale nemusí obsahovat žádné. Rubrika může obsahovat i další podrubriky. Ke každému článku lze přiřadit komentář (KOMENTÁŘ). Komentáře mohou vkládat i neregistrovaní uživatelé – uživatel může k článku vložit i více komentářů. V rámci diskusního fóra mohou uživatelé vkládat příspěvky (PŘÍSPĚVEK), do diskusních témat (TĚMA). Do daného diskusního tématu lze vložit více příspěvků. Diskusní téma může obsahovat více příspěvků, ale nemusí obsahovat žádné.. Diskusní témata jsou členěna do kategorií (KATEGORIE), přičemž diskusní téma může patřit jen do jedné kategorie. Kategorie může obsahovat více témat, ale i žádné. Kategorie může obsahovat i další podkategorie.
Jazyk pro tvorbu dynamických stránek
3.3.1 CGI skripty Dynamické stránky mohou být vytvářeny externím programem, který webové stránky generuje. Protokol pro vytvoření rozhraní mezi programem a webovým serverem, který tento program vyvolává, se nazývá CGI (Common Gateway Protocol). Toto rozhraní umožňuje předávání požadavků od klienta (prohlížeče) externí aplikaci. Webový server pak vrací výstup aplikace zpět klientovi. Tvorba CGI programů může probíhat v jakémkoli programovacím jazyce, který umí číst ze standardního vstupu a zapisovat do standardního výstupu. Opomineme-li CGI programy vytvořené pomocí některého z klasických programovacích jazyků (C, Pascal, C++, Java – CGI programy napsané v jazyce Java se nazývají servlety), jsou ve většině případů pro tvorbu CGI programů využívány interpretované „skriptovací“ jazyky. Pomocí nich vytvořené CGI programy jsou označovány jako CGI skripty. CGI skripty vytvořené pomocí interpretovaných jazyků (např. Perl) se nacházejí v textové podobě a k jejich spuštění je používán interpret, jímž může být přímo spustitelný program
10
(přípona EXE) nebo některá DLL knihovna. Výhodou interpretovaných jazyků je rychlý vývoj bez nutnosti kompilace a linkování Velkou nevýhodou CGI skriptů jsou problémy se zabezpečením. V interpretovaných skriptech je nutné zajistit dodatečné zabezpečení, protože šikovný hacker může odesláním určitého textu v poli formuláře, který je skriptem zpracováván, získat neoprávněný přístup k systému, na kterém webový server běží. Dalším bodem, který hovoří proti používání CGI skriptů, je špatné nakládání se systémovými prostředky počítače, na kterém je webový server provozován. Při každém zpracování požadavku, který volá CGI program, je nutné daný program znovu spustit (server vždy spouští samostatnou instanci programu). Jestliže požadavek odeslal větší počet uživatelů, mohou se tak zdroje serveru brzy vyčerpat. V dnešní době podporuje tvorbu dynamických stránek pomocí CGI programů jen malé množství hostingových služeb (z free-hostingových služeb téměř žádná). Z důvodů, které jsem zde uvedl jsem použití CGI programů pro tvorbu redakčního systému zavrhnul. 3.3.2 ASP Než přikročím k rozebrání výhod a nevýhod technologie ASP (Active Server Pages) musím vysvětlit pojem ISAPI. ISAPI (Internet Server Application Programming Interface) je lepší alternativou CGI. Na rozdíl od CGI, kde každé volání spustí novou instanci programu, ISAPI při prvním požadavku na aplikaci ji nahraje do paměti, ve které zůstane a stále reaguje na další požadavky uživatelů. ISAPI umožňuje vytvářet tzv. filtry, což jsou vlastně knihovny DLL, které tvoří prostředníky mezi uživatelem a webovým serverem. Technologie ASP je filtr ISAPI vyvinutý firmou Microsoft. Soubory ASP jsou vlastně HTML stránky obohacené o skripty. Pokud uživatel požaduje soubor s příponou .asp, filtr ISAPI interpretuje kód ASP a výsledný kód (X)HTML předá webovému serveru, který jej odešle prohlížeči. ASP ve skutečnosti není jazyk jako takový - základem ASP je skriptovací jazyk. Používat se dá téměř kterýkoliv skriptovací jazyk, přičemž nejvíce používané jsou jazyky VBScript (Visual Basic Script) a Script (implementace jazyka JavaScript od firmy Microsoft). Velkou nevýhodou technologie ASP je její komerční politika – není k dispozici zdarma. Technologie ASP je nativně používána pouze na webovém serveru IIS (Internet Information Server) firmy Microsoft. Závislost technologie ASP na platformě Windows, spolu s menší podporou hostingových služeb byly důvodem, proč jsem tuto technologii pro vytvoření systému nepoužil. 3.3.3 PHP Jedním z otců technologie PHP (PHP Hypertext Preprocessor) je Rasmus Lerdorf. V roce 1994 si Rasmus ve volném čase vytvořil jednoduchý systém pro evidování přístupu k jeho stránkám v interpretovaném jazyce Perl. Jelikož neustálé spouštění interpretu Perlu velmi zatěžovalo webový server, přepsal autor systém do jazyka C. Systém původně navržený pro osobní Rasmusovo použití se zalíbil i ostatním uživatelům serveru a začali ho používat. Ti přicházeli s požadavky na vylepšení celého systému. Autor proto celý systém rozšířil , doplnil jej o dokumentaci a uvolnil pod
11
názvem Personal Home Page Tools, který se později změnil na Personal Home Page Construction Kit. V téže době zprovoznil autor elektronickou konferenci pro výměnu zkušeností mezi uživateli systému. Později Lerdorf vytváří i nástroj, který umožňuje začleňování SQL dotazů do stránek, vytváření formulářů a zobrazování výsledků dotazů. Program pro zpřístupnění databází na webu nesl název Form Interpreter (FI). Spojením těchto dvou programů vznikl systém PHP/FI 2.0, který si získal celosvětovou proslulost. Jednalo se o jednoduchý programovací jazyk, který se zapisoval přímo do HTML stránek. Obsah zkratky PHP dnes ztratil svůj původní význam a doporučené označení celého systému je hypertextový preprocesor PHP. PHP je tedy skriptovací jazyk, jehož příkazy jsou do webových stránek umístěny mezi speciální oddělovače ( ?>, ). Vlastní skriptovací jazyk kombinuje několik programovacích jazyků – C, Perl, Java. Jazyk PHP umožňuje snadnou tvorbu dynamických stránek. Obsahuje rozsáhlé knihovny funkcí pro zpracování textu, grafiky, práci se soubory, přístup k různým databázovým serverům, podporu řady internetových protokolů (HTTP, SMTP, FTP, POP3, …). PHP lze jednoduchým způsobem doplnit o nové funkce, které standardně nejsou jeho součástí. Stránky obsahující PHP vsuvky jsou pro odlišení od běžných webových stránek ukládány s příponou .php (.php3, .phtml). Vývoj technologie PHP se zdaleka nezastavil. V současné době je k dispozici verze 5.15 – s pátou verzí se výrazně zlepšil přístup k objektově orientovanému programování, který je podobný jako v jazyce Java. Důvodem oblíbenosti jazyka PHP je jednoduchost jeho použití. Tím že PHP kombinuje vlastnosti více programovacích jazyků, ponechává vývojáři částečnou svobodu v syntaxi. PHP taktéž umožňuje přístup k mnoha datovým zdrojům a SŘBD (Systémům Řízení Báze Dat) v jejich nativním formátu nebo přes obecné rozhraní ODBC (Open Database Connectivity). Obrovskou výhodou technologie PHP je to, že je šířena jako freewarový produkt včetně zdrojových kódů. PHP není závislé ani na platformě ani na webovém serveru na kterém je provozováno. Lze jej tedy užívat jak pod Windows tak i pod jinými operačními systémy s tím, že není svázáno s žádným konkrétním serverem a proto může běžet na libovolném. To dokazuje i obrovský počet serverů na kterém je PHP používáno a jeho velká podpora ze strany hostingových služeb. Výhody, které technologie PHP nabízí, se slučují s požadavky vytvářeného systému a to především z hlediska využitelnosti. Z těchto důvodů jsem si jako jazyk pro tvorbu dynamických stránek vybral právě technologii PHP a to konkrétně verzi 4.2.x, která je podporována na většině serverů (jen omezené množství serverů nabízí podporu PHP ve verzi 5.x). PHP ve verzi 5 je zpětně kompatibilní s verzí 4, ale zahrnuje obrovské množství nových funkcí. Ačkoliv jsem systém vyvíjel pomocí PHP verze 5.1.1, dbal jsem na to, abych využíval jen funkcí, které jsou obsaženy i v PHP verze 4.2.x a zajistil tak kompatibilitu. Velkým zdrojem informací o jazyce PHP a referenční příručkou mi byla kniha od Jiřího Koska [4].
3.4
Webový server
Ruku v ruce s výběrem skriptovacího jazyka pro vytváření dynamických stránek jde i výběr webového serveru na kterém má být vytvořený systém provozován. Dvěma nejpoužívanějšími webovými servery v dnešní jsou servery Apache a IIS od firmy Microsoft.
12
3.4.1 IIS IIS neboli Internet Information Services označuje sadu internetových služeb pro servery běžících pod operačním systémem Microsoft Windows. Dle anglické společnosti Netcraft, která se zabývá monitorováním internetu se zaměřením na analýzu používaných webových serverů a operačních systémů na kterých servery běží, je webový server IIS druhým nejpoužívanějším hned po serveru Apache, který je používán na nadpoloviční většině webových serverů. Dle statistik se propast mezi množstvím využití serveru Apache a serveru IIS nadále prohlubuje a to ve prospěch technologie Apache. Webový server IIS je komerční produkt, který je distribuován společně s operačním systémem Microsoft Windows Server 2003, což není zrovna laciná záležitost. Spjatost webového serveru IIS a menší podpora technologie ze strany hostingových služeb mě odradily od využití tohoto serveru. 3.4.2 Apache Apache HTTP Server je softwarový webový server šířený pod open-source licencí. Je použitelný na množství moderních operačních systémů – Unix, Microsoft Windows, Linux. Jeho vývoj začal v roce 1993 v NCSA (National Center for SuperComputing Applications) na Illinoiské univerzitě. Původní název projektu byl NCSA HTTPd. Odchod hlavního programátora Roba McCoola z vývojářského týmu v roce 1994 vedl ke zpomalení vývoje a v roce 1998 k jeho úplnému zastavení. NCSA HTTPd se mezitím rozšířil mezi správci serverů, kteří jej používali a dodávali k němu vlastní úpravy – patche (záplaty). Odtud pochází název webového serveru Apache „A patchy server“ (záplatovaný server). Hlavní úlohu v dalším vývoji sehráli Brian Behlendorf a Cliff Skolnick, kteří založili emailovou konferenci a začali sběr úprav a oprav a jejich distribuci koordinovat. První veřejná verze s označením 0.6.2 byla vydána v dubnu 1995. Následovalo kompletní přepsání kódu (Apache 2 neobsahuje nic z původního NCSA HTTPd) a založení Apache Group, která je dnes základem vývojářského týmu. Od dubna 1996 byl Apache nejpopulárnějším serverem na internetu. Dle průzkumů firmy Netcraft dosáhla používanost serveru Apache v listopadu 2005 jeho používanost 69% všech webových serverů. Apache je velice výkonný a stabilní server, který je k dispozici zadarmo. Skriptovací jazyk PHP, který jsem si pro implementaci zvolil může být používán na jakékoliv platformě, se serverem Apache však tvoří velice silnou kombinaci. Kombinace serveru Apache a skriptovacího jazyka PHP pro mě byla ideální volbou.
3.5
Databáze
Všechna data tvořící informační obsah vytvářeného systému by měla být uložena v datové vrstvě webového serveru. Datová vrstva je ve většině případů tvořena databází, která poskytuje mnoho výhod při přístupu k datům a jejich zabezpečení. Databázových systémů dnes existuje mnoho ale mezi nejpoužívanější patří: • • • • •
Oracle Microsoft SQL Server Microsoft Access PostgreSQL MySQL
13
Tento krátký výčet samozřejmě nezahrnuje všechny dnes dostupné databáze. Jednotlivé databáze se velmi liší množstvím funkcí, které poskytují ale i rychlostí přístupu k datům. 3.5.1 Oracle Oracle je v současnosti jeden z nejpropracovanějších databázových systémů. Jediná jeho podstatná nevýhoda je, že neexistuje bezplatná verze a ceny komerčních licencí jsou vysoké. Z tohoto důvodu je provozován pouze úzkým okruhem hostingových služeb a cena těchto služeb je pro běžného uživatele taktéž poměrně vysoká. 3.5.2 Microsoft SQL Server Microsoft SQL Server je výkonný databázový systém společnosti Microsoft, který byl běžně používán ke správě menších až středně velkých databází. V posledních pěti letech však tento produkt zaznamenal zvýšené využití i v oblasti větších podnikových (enterprise) databází. Omezením tohoto databázového systému je závislost na platformě Microsoft Windows a ačkoliv se jedná o kvalitní produkt, jeho cena se pohybuje nad možnostmi běžných uživatelů. Pro úplnost je třeba dodat, že firma Microsoft poskytuje také bezplatnou verzi MS SQL Serveru s názvem MSDE (Microsoft Data Engine), což je databáze upravená pro použití v menších projektech. Optimální výkon MSDE je však zaručen pro maximálně pět souběžných uživatelských přístupů a proto je pro naše účely ztěží použitelný. 3.5.3 Microsoft Access Microsoft Access (plný název Microsoft Office Access) je systém pro správu relačních databází od firmy Microsoft, který je částí balíku Microsoft Office Professional, jedná se tedy o komerční produkt. Microsoft Access může přistupovat k datům uloženým v databázích Microsoft SQL Server, Oracle, ale i k jakékoli databázi vyhovující ODBC rozhraní. V projektech Microsoft Access lze využít dotazovacího jazyka SQL. Tento systém se hodí spíše pro správu menších databází a pokud je očekáván velký počet dotazů na databázi, je lepší využít silnějších zbraní jako třeba Microsoft SQL Server nebo MySQL (viz. níže). Souborové databáze typu access mají poměrně slabou výkonnost a při větším provozu dochází k chybám a přetěžování stroje. Microsoft Access je vázán na platformu Windows. 3.5.4 PostgreSQL PostgreSQL je robustní plnohodnotný relační databázový systém s otevřeným zdrojovým kódem. Je produktem patnáct let trvajícího aktivního vývoje a má vynikající pověst pro svou spolehlivost a bezpečnost. Systém lze provozovat na všech rozšířených operačních systémech včetně Linuxu, Uniových OS a Windows. PostgreSQL je šířen pod BSD licencí (Berkeley Software Distribution), která ,jak význam zkratky napovídá, pochází z Kalifornské univerzity v Berkeley a která je nejliberálnější ze všech open source licencí. Systém PostgreSQL může být dle licence neomezeně používán, modifikován i distribuován. Velkou předností systému PostgreSQL je rozšiřitelnost. Systém může být rozšířen o nové datové typy, funkce, operátory, agregační funkce. 3.5.5 MySQL MySQL je vysoce výkonný a stabilní relační databázový systém, který dokáže pojmout velké množství dat, aniž by při tom ztratil mnoho ze svého výkonu. MySQL není vázán
14
na konkrétní platformu a může být využit na všech dnes používaných operačních systémech. Systém MySQL je průkopníkem dvojího licencování – k dispozici je jak pod bezplatnou licencí GPL1 (General Public Licence), tak pod komerční placenou licencí, jejíž cena však není nijak vysoká a je jen zlomkem ceny konkurenčních produktů. Systém MySQL byl od počátku optimalizován především na rychlost, a to i za cenu některých zjednodušení. Starší verze systému MySQL, využívající výchozího typu tabulek MyISAM2 nepodporuje pohledy, triggery, poddotazy, transakce, referenční integritu (cizí klíče). Většina těchto nedostatků byla odstraněna v novějších verzích MySQL a pomocí dalšího typu tabulek InnoDB. Přehled podporovaných vlastností: • Cizí klíče (podporovány v tabulkách InnoDB od verze 3.23) • Transakce (podporovány v tabulkách InnoDB od verze 3.23.44) • Poddotazy (od verze 4.1) • Triggery (od verze 5.0) • Pohledy (od verze 5.0) Nově podporované pokročilé vlastnosti systému jsou kvůli malé podpoře tabulek InnoDB a nasazení starších verzí MySQL na serverech třetích stran pro mé účely přesto nepoužitelné. Mrzí mě to především kvůli nemožnosti využití referenčních integrit, transakcí a pohledů – tyto vlastnosti však pro vytvoření redakčního systému nejsou nezbytné. Pro svůj výkon a díky volné šiřitelnosti softwaru má systém MySQL vysoký podíl v současné době používaných databázích. Velmi oblíbená a jako základní software webového serveru nasazovaná je kombinace MySQL, PHP a Apache. Velice užitečnou pomůckou pro správu tabulek databáze MySQL prostřednictvím webového rozhraní je program phpMyAdmin napsaný v jazyce PHP. 3.5.6 Zhodnocení Po uvedení výčtu používaných databázových systému a jejich kladů a záporů je třeba vybrat databázi, která nejlépe odpovídá účelům redakčního systému. První dva komerční produkty Oracle a Microsoft SQL Server jsem z výběru použitelného databázového systému vyloučil pro jejich nedostupnost běžnému uživateli, která je dána vysokou cenou a malou podporou ze strany hostingových služeb. Pro jejich nespornou kvalitu a propracovanost jsem se však o nich nemohl nezmínit. Databáze Microsoft Access nesplnila požadavky především pro svou vazbu na operační systém Windows a menší výkonnost při větší zátěži databáze. Ze zbylých dvou databází PostgreSQL a MySQL jsem nakonec zvolil systém MySQL. Ačkoliv databáze PostgreSQL nabízí širokou funkčnost a rozšiřitelnost, obrovská
1
GPL licence umožňuje neomezené užívání softwaru. Zdrojové mohou být používány a upravovány, ale šířeny musí být opět pod GPL licencí a to bezplatně (případně za cenu distribučních nákladů). 2 MyISAM je označení pro výchozí ukládací engine systému MySQL – operace nad tabulkami tohoto typu jsou velice rychlé
15
podpora ze strany hostingových služeb a vysoký výkon jsou - i přes nemožnost využití pokročilých vlastností systému - argumenty pro výběr databáze MySQL.
3.6
Skriptovací jazyk na klientské straně
Provádění programů a skriptů pouze na straně serveru zpomaluje odezvy na požadavky uživatelů. Řešením je přesun provádění části skriptů ze strany serveru na stranu klienta (prohlížeče). Ve vytvářeném redakčním systému má být skriptů na klientské straně využíváno především pro kontrolu správnosti údajů vyplňovaných uživateli do formulářů před jejich odesláním serveru. První technologií, která daný problém řeší, je jazyk Java od firmy Sun MicroSystems. Tento jazyk umožňuje psaní appletů, programů, které mohou být začleněny přímo do HTML stránky. Velkou výhodou Javy je její nezávislost na platformě – programy jsou po síti přenášeny formou byte kódu, který je spustitelný v libovolném operačním systému, pokud pro něj existuje JVM (Java Virtual Machine) - interpret Javy. Java je výborná perspektivní technologie, jejíž možnosti jsou opravdu široké. Kvůli své univerzálnosti je však poměrně náročná na systémové zdroje počítače. Druhou technologií je JavaScript, s kterým přišla v roce 1996 firma Netscape a zabudovala jej do svého legendárního prohlížeče Netscape Navigator. JavaScript je jednoduchý interpretovaný jazyk, který syntaxí vychází z jazyku Java. JavaScript se přímo zapisuje do kódu stránky nebo může být načten z externího souboru s příponou .js. Jeho nejčastější použití je ve spojení s formuláři. Skripty v JavaScript mohou kontrolovat správnost údajů v jednotlivých polích formuláře ještě před odesláním na server. Uživatel získá mnohem rychlejší odezvu, než kdyby údaje byli odeslány ke zpracování na server. Další oblastí využití JavaScriptu je vylepšení interaktivnosti stránek – JavaScript může reagovat na události vyvolané uživatelem (např. změna barvy pozadí odkazu při přejetí myší). JavaScript je svými možnostmi pro vytvářený redakční systém ideální. Omezení jazyka JavaScript: • • • •
3.7
Funguje pouze v prohlížeči Neumí přistupovat k souborům (kromě cookies) ani k systémovým objektům Neumí data uložit (kromě cookies) Uživatel může JavaScript zakázat
Formát generovaných dokumentů a definice vzhledu
Až do této chvíle jsem pro dokument prezentovaný na internetu používal jako synonymum termín HTML stránka. Toto označení je zavádějící a čtenář tohoto textu by se mohl domnívat, že HTML je jediným možným formátem webového dokumentu. Rozhodně tomu tak není, ačkoliv většina dokumentů (především z dřívějších dob) vytvořená v tomto formátu tomu příliš nenasvědčuje. Od vytváření stránek v jazyce HTML se dnes postupně upouští. Jazyk HTML totiž umožňuje ve svém kódu používat značek a atributů definujících vzhled dokumentu. Při změně vzhledu takového dokumentu je nutné změnit jeho kód. Jazyk HTML již přestává vyhovovat pro svou složitost, která vznikla jeho postupným (a svévolným) rozšiřováním. 16
3.7.1 XML Dalším jazykem pro vytváření webových stránek je XML (eXtensible Markup Language), což je obecný značkovací jazyk, který byl vyvinut a standardizován konsorciem W3C [1]. XML umožňuje snadné vytváření konkrétních značkovacích sad pro různé účely. Jazyk umožňuje popsat strukturu dokumentu z hlediska věcného obsahu jednotlivých částí a sám o sobě se vzhledem dokumentu nezabývá. Vzhled dokumentu se definuje připojeným stylem. Další možností je pomocí různých stylů provést transformaci do jiného typu dokumentu nebo do jiné struktury XML. Jazyk XML neobsahuje předdefinované značky (tagy) a je třeba definovat značky, které budeme používat. Značky je možné (nepovinně) definovat v souboru DTD (Dokument Type Definition). XML dokument lze poté kontrolovat, zda odpovídá této definici pomocí programu zvaného parser. Při používání XML dokumentu jej také potřebujeme zobrazit. XML samo žádné prostředky pro definici vzhledu nenabízí. Soubor pravidel pro změnu vzhledu dokumentu nebo pro převod do jiného formátu se nazývá styl a lze jej definovat pomocí několika stylových jazyků. Jeden styl můžeme aplikovat na větší počet dokumentů stejného typu, ale taktéž můžeme na jeden dokument aplikovat více různých stylů. 3.7.2 XHTML Značkovací jazyk XHTML je následníkem jazyka HTML, ale na rozdíl od svého předchůdce se jedná o aplikaci XML. Cílem bylo převedení staršího jazyka HTML tak, aby vyhovoval podmínkám tvorby XML dokumentů. Syntaxe jazyka XHTML je oproti HTML přísnější. Stejně jako jazyk HTML i XHTML existuje ve třech druzích: Strict (nejpřísnější varianta), Transtional a Frameset, které se liší množstvím povolených formátovacích značek a tím i důsledností oddělování informačního obsahu stránek od formy.
Obr. 3.7.1 – Druhy jazyků HTML a XHTML
3.7.3 CSS Pro popis způsobu zobrazení stránek napsaných v jazycích HTML, XHTML nebo XML se využívá kaskádových stylů CSS (Cascading Style Sheets). Hlavním smyslem použití stylů je oddělení vzhledu dokumentů od jejich struktury a obsahu. Tuto možnost měl
17
zajišťovat už jazyk HTML, ale v důsledku nedostatečných standardů a konkurenčního boje prohlížečů se vyvinul do podoby, která obsahuje celou řadu elementů popisujících zobrazení dokumentu. Z hlediska vyhledávání informací a zpracování dokumentů není takový vývoj žádoucí. Velkou výhodou CSS je, že veškerý design a formátování se načítá z externího souboru .css, který může být společný pro celý web (souborů se styly může být více a mohou být vzájemně kombinovány) – při změně designu webu pak stačí pouze opravit tento soubor. Definice stylů může být také přímou součástí HTML / XHTML dokumentu, ale tím ze vytrácí výhoda použitelnosti definovaných stylů i pro další stránky. Kaskádové styly umožňují vytvářet různá zobrazení dokumentu pro různá výstupní zařízení (např. pro tisk). Rozsáhlým zdrojem informací o kaskádových stylech je kniha Petr Staníčka [6]. 3.7.4 DHTML Technologie DHTML (Dynamic Hypertext Markup Language) vychází ze stejné myšlenky jako skriptovací jazyk JavaScript. Jejím cílem je dokument reagující na události bez spolupráce se serverovou stranou webové aplikace (změna obsahu stránky, validace formulářů). V DHTML je přístupný každý objekt webové stránky a s každým objektem je možné manipulovat – měnit jeho obsah, způsob zobrazení apod. Jako objekty jsou přístupné i styly připojené ke stránce. DHTML je skloubením následujících technologií: • • •
DOM (Dokument Object Model), což je objektově orientovaná reprezentace webových dokumentů umožňující modifikaci obsahu, struktury nebo stylu dokumentu a jeho částí. Skriptovací jazyk na klientské straně - JavaScript Kaskádové styly CSS
Obr. 3.7.2 – DHTML – použité technologie
Za výsledný formát dynamicky generovaných dokumentů jsem zvolil jazyk XHTML. Přísnější kontrola syntaxe v tomto jazyce zabraňuje psaní nevalidních webových stránek, které mohou být v různých prohlížečích špatně interpretovány. V souladu s technologií DHTML je vzhled dokumentů definován pomocí kaskádových stylů a interakce s uživatelem je obstarávána pomocí JavaScriptu.
18
3.8
Kódování
Aby byl systém využitelný na českých, cizojazyčných nebo i vícejazyčných portálech, je třeba zvolit vhodné kódování pro zobrazení obsahu v správném nezkresleném tvaru. 3.8.1 Znaková sada Jestliže chceme, aby počítač uměl pracovat s textem, musíme nadefinovat jaké znaky se v textu mohou vyskytovat. Množina znaků, kterou je možné v textu používat se nazývá znaková sada. Jednotlivé znaky jsou reprezentovány číselným kódem. Znaková sada je právě taková množina znaků, kde každý znak má přiřazený číselný kód. Historický vývoj dal vzniknout stovkám různých znakových sad. Nejznámější z nich je znaková sada ASCII (American Standard Code for Information Interchange), která definuje 128 znaků, jež zahrnují písmena anglické abecedy, číslice, interpunkční znaménka a pár dalších speciálních znaků. Znaková sada ASCII je vhodná pro psaní textů v angličtině, pro psaní programových kódů apod. Nelze v ní však psát například české texty, protože neobsahuje znaky s diakritikou. Vzniklo mnoho sad, které jsou rozšířením ASCII – definují celkem 256 znaků. Prvních 128 znaků je stejných jako v ASCII a zbylých 128 může být použito pro národní sady. Pro češtinu takových sad existovalo několik – v dnešní době se používají zejména znakové sady ISO Latin 2 (ISO 8859-2) a Windows 1250. Znaková sada definuje množinu dostupných znaků a jejich číselných kódů. Abychom mohli text v nějaké znakové sadě uložit do souboru nebo přenést po síti, musíme jednotlivé kódy znaků převést na posloupnost bytů. Způsobu převodu číselného kódu znaku do posloupnosti bytů se říká kódování. Protože historické znakové sady (ASCII, ISO Latin 2, …) obsahují nejvýše 256 znaků, lze kód znaku rovnou zapsat jako jeden byte. 3.8.2 Unicode Problém znakových sad jako ISO Latin X a Windows 125x je v tom, že jsou navrženy pro ukládání textů v omezené množině jazyků. Východiskem proto bylo vytvoření univerzální znakové sady, která by zahrnovala znaky všech běžně používaných jazyků. Při jejím použití by bylo možné v textu užívat libovolný v ní definovaný znak. Tato univerzální znaková sada vnikla na počátku 90. let minulého století a nese název Unicode. Stejně jako u jakékoliv jiné znakové sady je třeba číselné kódy znaků Unicode pro reprezentaci převést na posloupnost bytů. Vzhledem k velkému počtu znaků není už kódování v podobě identity, kdy se kód znaku zapisuje přímo beze změn, příliš elegantní. Takové kódování existuje a jmenuje se UTF-32 (UCS Transformation Format). Jeden znak se zapíše do čtyř bytů a přímo reprezentuje číselný kód znaku. Tato varianta reprezentace textu je velice neúsporná a v praxi se nejčastěji setkáme s kódováním UTF-8 a UTF-16. 3.8.3 UTF-8 Kódování UTF-8 se dnes v prostředí internetu pro kódování textu ve znakové sadě Unicode používá nejčastěji. Zvláštností UTF-8 je to, že jeden znak může zakódovat do proměnlivého počtu bytů (jednoho až čtyř). Prvních 128 znaků Unicode je převzato
19
z ASCII – UTF-8 znaky s kódem menším než 128 přímo kóduje jako jeden byte. Znaky s kódy většími než 128 jsou reprezentovány jako několik bytů. Všeobecná podpora Unicode je hudbou budoucnosti, stránky kódované v UTF-8 lze však bez problémů používat – v prohlížečích je kódování UTF-8 podporované. Pro účely vytváření systému s možností vkládání obsahu v různých jazycích je kódování UTF-8 ideální.
4. Návrh řešení 4.1
Struktura databáze
Datový model v analytické části dokumentu byl využit ke specifikaci struktury databáze. Databáze obsahuje následující tabulky: • • • • • • •
Uživatel Článek Rubrika Komentář Příspěvek Téma Kategorie
Relační model databáze, který znázorňuje tabulky, relace mezi nimi, datové typy jednotlivých atributů, lze nalézt v příloze B. Rád bych se zde pozastavil nad prvky databáze, které z modelu nejsou nebo nemusí být patrné. Z relačního modelu databáze nelze vyčíst, že všechny primární identifikátory tabulek mají speciální vlastnost auto_incremet, která, jak již název napovídá, atributu s danou vlastností přiřazuje hodnotu proměnné databáze, která je vždy při vložení údaje do tabulky inkrementována o jedna. Pole s vlastností auto_increment nemůže nabývat záporných hodnot ani hodnoty nula a v každém záznamu má unikátní hodnotu. Požadavkem na datový model byla možnost vkládat do rubriky článků i další podrubriky. Tento požadavek byl vyřešen přidáním atributu „id_parent” do tabulky „Rubrika“, který obsahuje identifikační číslo rubriky o úroveň výše. Zřetězením záznamů přes atribut „id_parent” vytváříme hierarchii rubrik. Výchozí hodnota atributu „id_parent” je nula a označuje, že daná rubrika je rubrikou hlavní, je kořenem hierarchie rubrik a nad ní se už žádná nevyskytuje (Žádné identifikační číslo rubriky nemůže díky speciální vlastnosti auto_increment nabývat hodnoty nula). Stejné řešení bylo použito pro možnost vkládání podkategorií do kategorií článků. V analytické části byla navržena hierarchie uživatelských rolí a přidělení práv pro práci se systémem. Rozdělení uživatelských rolí v tabulce „Uživatel“ je řešeno pomocí atributu „role“, který může obsahovat jeden znak (char). Tento příznak určuje, jaká uživatelská role byla uživateli přidělena. Atribut role může nabývat těchto hodnot: • • •
A – Administrátor R – Redaktor M – Moderátor
20
•
U – Registrovaný uživatel – v analytické části byla tato role nazývána čtenář.
Databáze MySQL nabízí pro toto řešení vhodnější datový typ atributu a tím je výčtový typ enum, který umožňuje čitelné a úsporné uložení výčtu hodnot do databáze. Z hlediska možného budoucího přechodu na jiný typ databáze jsem se rozhodl použít obecný, ale méně čitelný způsob řešení pomocí všemi databázemi podporovaného datového typu char místo méně podporovaného typu enum.
4.2
Struktura systému
Pro členění webových stránek na menší části má jazyk PHP velice silnou zbraň a tou jsou příkazy include a require. Tyto příkazy slouží k vkládání souborů dovnitř PHP skriptu. Díky těmto příkazům můžeme jeden soubor vkládat třeba do stovky jiných a při změně obsahu je nutné upravit pouze ten jeden vkládaný, což je velice elegantní řešení. Rozdíl mezi příkazy include a require spočívá v jejich chování v okamžiku, kdy vkládaný soubor neexistuje. Příkaz include vyprodukuje varování (warning) a skript pokračuje dál v běhu. Příkaz require je v tomto ohledu striktnější a v případě, že soubor není nalezen, vyprodukuje fatální chybu (fatal error), která způsobí předčasné ukončení skriptu. Vložený soubor je považován za nedílnou součást původního dokumentu a pokud je v něm obsažen kód jazyka PHP, normálně se provede. Pomocí příkazů include a require lze soubor do skriptu vložit vícekrát. Existují však další dva příkazy require_once a include_once, které fungují stejně jako předchozí dva, jen s tím rozdílem, že zabrání opětovnému vložení stejného souboru. Pomocí těchto elegantních prostředků jazyka PHP je projekt rozdělen do samostatných souborů .php zajišťujících hlavní funkce systému. Tyto skripty využívají společných funkcí v souborech určených k začlenění do hlavních skriptů. Takové rozdělení je výhodné především z hlediska rozšiřitelnosti a přehlednosti systému.
4.3
Navigace
U stránek se statickým předpřipraveným obsahem je vytvoření dobré provázanosti jednotlivých dokumentů, které tvoří celek, snadnou záležitostí, protože vždy víme, na jakou konkrétní stránku se chceme dostat. U dynamicky vytvářených stránek však může být navigace mezi stránkami, ale i v rámci jedné stránky tvrdým oříškem . Pokud si například uživatel bude v rámci redakčního systému prohlížet titulky článků z určité rubriky, očekává že se po výběru článku ocitne na stránce s jeho obsahem. Při vytváření stránek však nemůžu vědět, který článek si čtenář vybere a nemohu proto vytvořit konkrétní odkaz. Řešení spočívá v sdílení dat mezi stránkami. Skriptu, který se stará o zobrazení obsahu článků, musí být předán identifikátor vybraného článku, aby byl skript schopen vypsat obsah správného článku. Způsobů sdílení dat mezi stránkami je v PHP několik. 4.3.1 Cookies Cookies představují mechanismus pro ukládání informací na počítači klienta. Cookie je v podstatě krátký text, který je zaslán prohlížeči spolu s požadovanou stránkou. Prohlížeč u sebe cookies uloží jako soubory a při další návštěvě stejným uživatelem je předá zpět. Obsahem cookies může být cokoli – celková velikost je omezena na 4kB.
21
Pro vysílaní cookies používá PHP funkci setcookie – tato funkce zapisuje do hlaviček HTTP protokolu a je nutné ji použít dřív, než cokoli vypíšeme na výstup. Čtení cookies je velice jednoduché. V PHP jsou cookies k dispozici v rámci asociativního pole $_COOKIE. Obsah cookies lze snadno zjistit, a proto se příliš nehodí pro přenos citlivých dat. Velkou nevýhodou je možnost zakázání cookies na straně klienta. Pokud je aplikace na cookies závislá, je v takovém případě nefunkční. Cookies jsou v mém případě pro předávání dat v rámci navigace v systému nevhodná. 4.3.2 Přenos informací jako parametry v URL Informace lze přenášet mezi stránkami jejich začleněním do URL dokumentu. V praxi má tento přístup podstatnou výhodu – pracuje úplně všude a je proto také často používán. Na druhou stranu velkou nevýhodou tohoto přístupu ke sdílení informací mezi stránkami je možnost přenášené údaje snadno přečíst a změnit. Přenášené údaje je možné zašifrovat, ale i tak není tento způsob pro přenášení citlivých dat zrovna vhodný. K jednotlivým parametrům v URL se v PHP přistupuje pomocí globálního asociativního pole $_GET. V jednotlivých skriptech, které mezi sebou data sdílejí je vhodné zabezpečit kontrolu správného tvaru parametrů, aby se předešlo možným problémům způsobených změnou hodnot proměnných v URL samotnými uživateli. Tento přístup ke sdílení informací je v systému využit pro předávání většiny parametrů. 4.3.3 Sessions Sessions je velice silný mechanismus, který nám umožňuje pro každého uživatele uchovávat různé údaje. Po celou dobu relace, tedy až do doby, než je session zrušena nebo je uzavřen prohlížeč mají PHP skripty přístup k proměnným uloženým v session. Session je ideální způsob, jak uchovávat informace přidružené k určitému uživateli. Velkou výhodou je uložení všech citlivých informací na serveru. Do prohlížeče se předává pouze identifikátor session. PHP skript si každého uživatele označí jedinečným identifikátorem (32 znaků dlouhým řetězcem). Tento identifikátor se pak předává společně s každým voláním skriptu. PHP předává identifikátor dvěma způsoby – pomocí cookies nebo jako parametr v URL. Díky identifikátoru PHP skripty vždy ví, o jakou session se jedná. K proměnným uloženým v session se přistupuje pomocí globálního asociativního pole $_SESSION. Sdílení informací pomocí session je v redakčním systému a diskusním fóru využito při přihlašování uživatelů do systému. Po kontrole správnosti přihlašovacích údajů uživatele (uživatelské jméno a heslo) se jeho identifikační číslo uloží do session, kde s ním mohou jednotlivé skripty pracovat.
4.4
Tvorba formulářů
Ve vytvořeném redakčním systému a diskusním fóru hrají formuláře podstatnou roli. Dá se říci, že uživatel na ně narazí na každém kroku (při přihlašování do systému, při vkládání příspěvků, apod.). Aby měl uživatel při jejich vyplňování dostatečný komfort, držel jsem se při vytváření formulářů určitých pravidel. Údaje vyplňované uživatelem musí být kontrolovány na klientské straně (JavaScriptem) a v případě chybných hodnot nahlásit chybu. Takovýmto způsobem dosáhneme rychlé zpětné vazby a uživatel nemusí čekat, až server formulářová data zpracuje a po prodlevě 22
mu oznámí, že je v nich chyba. Data odesílaná přes formulář musí být kontrolována i na straně serveru pomocí PHP. Uživatel může mít totiž JavaScript vypnutý. Větším důvodem pro kontrolu formulářů na straně serveru je nutnost využití obsahu datové vrstvy ke kontrole správnosti údajů (klientské skriptovací jazyky nemají k datové vrstvě serveru přístup) – typickým příkladem je například zjištění, zda se uživatelské jméno právě registrovaného uživatele již nenachází v databázi. Po odeslání neúplného nebo chybně vyplněného formuláře by se měl jeho obsah zachovat. Nic nevede k větší frustraci uživatelů, než nutnost při každé chybě vyplňovat všechny údaje znovu. Z podobného důvodu by se ve formulářích nemělo vyskytovat tlačítko reset, pokud to není bezpodmínečně nutné (což ve většině případů není). Uživatele tento formulářový prvek povětšinou pouze mate. K dobrým způsobům při vytváření formulářů patří užití stručných a pochopitelných popisků formulářových polí spolu s doplněním polí o krátkou nápovědou. Počet položek, které musí být nutně vyplněny je dobré snížit na co nejmenší počet a tyto položky jasně označit.
5. Realizace V této části dokumentace jsou popsány podrobnosti s akcentem na nestandardní části řešení práce. Začnu výčtem hlavních PHP skriptů umístěných v oddělených souborech a popisem jejich hlavních funkcí. Skripty tvořící redakční systém jsou odděleny od skriptů diskusního fóra. Tyto skripty tvoří hlavní funkční celky a jsou umístěny v samostatných adresářích. Další skupinou jsou skripty určené pro začleňování do ostatních skriptů. Poslední skupinu tvoří skripty, které plní specifické funkce pro celý systém. Redakční systém: • index.php – hlavní stránka redakčního systému, na které jsou vypsány titulky a ukázky nejnovějších článků. Skriptu umožňuje prohlížení výpisů článků v jednotlivých a rubrikách a podrubrikách. • autor.php –skript zobrazuje informace o určitém autorovi a výpis článků, které do systému vložil. • clanek.php – zobrazuje obsah konkrétního článku • clanek_pridat.php – skript umožňující vkládání článků do systému (databáze). • komentar.php – tento skript zobrazuje komentáře vztahující se k určitému článku. • komentar_pridat.php – skript umožňující vkládání komentářů do systému. Diskusní fórum: • index.php – hlavní stránka diskusního fóra, která umožňuje prohlížení jednotlivých diskusních kategorií s výpisy příslušných diskusních témat. • prispevek.php – tento skript umožňuje vkládání příspěvků do systému a úpravu již vložených příspěvků • tema.php – výpis příspěvků z daného diskusního tématu • uzivatel.php – skript zobrazující informace o konkrétním o uživateli Začleňované skripty: • dbconnect.php – skript obsahující funkce pro připojení k databázi a práci s ní • functions.php – funkce určené k použití v ostatních skriptech
23
•
reg_validate.php – skript zajišťující kontrolu vstupních údajů z rozsáhlejšího registračního formuláře. Od původního skriptu pro registraci uživatelů byl oddělen z důvodu přehlednosti kódu.
Celý systém: • login.php – přihlašování do systému pomocí uživatelského jména a hesla • registrace.php – registrace nového uživatele – vložení jeho údajů do databáze • nastaveni.php – hlavní stránka pro změnu nastavení údajů o uživateli • nastavit_heslo.php – změna hesla pro přihlášení do systému • nastavit_osobni.php – změna osobních údajů uživatele
5.1
Zabezpečení
5.1.1 Speciální znaky Některé řetězce, které do redakčního systému a diskusního fóra vkládají uživatelé, mohou obsahovat znaky, které jsou součástí značkovacího jazyka použitého k vytváření webových stránek. Přítomnost takového znaku může způsobit narušení kódu a jeho struktury. Zkušení uživatelé mohou do systému záměrně vkládat značky s cílem stránky narušit, je proto nutné zajistit, aby se znaky uvozující značky HTML jazyka neinterpretovaly jako speciální znaky, ale jako obyčejné znaky. Jazyk PHP pro tyto účely nabízí užitečnou funkci htmlspecialchars. Tato funkce převádí speciální znaky na znakové entity HTML (které jsou při interpretaci považovány za obyčejné znaky). Funkce převede všechny speciální znaky HTML (‘<’, ’>’, ‘”’ a ‘&’) na znakové entity (‘<’, ‘>’, ‘"’, a ‘&’) – žádné jiné znaky nepřevádí. Funkci je vhodné používat vždy, když do stránky zahrnujeme text odeslaný uživatelem z formuláře. Při převedení „nebezpečných“ znaků na znakové entity nemá uživatel možnost kód stránek narušit. 5.1.2 SQL injection Pod pojmem SQL injection se skrývá snaha o podvržení SQL dotazu pomocí hodnot proměnných odesílaných serveru (ve formě parametrů URL, údajů odesílaných formulářem) za účelem neoprávněného přístupu k datům nebo poškození databáze. Pokud útočník zná strukturu databáze, kterou chce svou činností ovlivnit, má vše daleko jednodušší, než když musí odhadovat, jaké sloupce jsou použity, jak se jmenují a jaké datové typy využívají. Je proto nesmírně důležité, aby skripty podávaly co nejméně informací o struktuře databáze a tabulek v případě, že se vyskytne nějaká chyba. Kombinace jazyka PHP a databáze MySQL má proti technikám SQL injection silnou zbraň. PHP nepovoluje vykonávání několika SQL dotazů v jednom volání funkce mysql_query, takže tím odpadá problém se snahou vložit za náš SQL dotaz ještě další, oddělený středníkem. U databáze MysQL zase neexistují prostředky, kterými by mohly být volány externí aplikace – tím je vyloučeno množství potenciálně nebezpečných SQL dotazů. Možnou obranou proti SQL injection, kterou jsem pro vytvářený systém využil, je vhodné ošetření veškerých vstupních dat. V PHP k tomu slouží funkce addslashes. Tato funkce doplní zpětná lomítka před citlivé znaky, kterými jsou apostrof, uvozovky a
24
zpětné lomítko. Funkce je užitečná pro úpravu řetězců před jejich začleněním do SQL dotazů. Podobný účel má i direktiva magic_qoutes_gpc v nastavení serveru. Pokud je tato direktiva zapnutá, veškeré hodnoty jsou uzavřeny do apostrofů. Na serverech třetích stran však nemůžeme nastavení této direktivy ovlivnit a nemůžeme se tedy na to, že je zapnuta, spoléhat. 5.1.3 Vícenásobné odeslání formuláře DFS (Duplicate Form Submission) neboli vícenásobné odeslání formuláře je nepříjemný jev, který nastává, pokud uživatel po vyplnění formuláře a jeho úspěšném odeslání stránku znovu načte (reload) nebo se na ní pomocí historie stránek vrátí. V tom případě se uživateli zobrazí dialogové okno s varováním, že data budou znovu odeslána – přičemž zvýrazněna je možnost odeslání. Pokud uživatel volbu odsouhlasí, původní odeslaná data jsou zpracována znovu. V případě vkládání formulářových dat do databáze tak může vzniknout množství duplicitních vstupů. Řešení je poměrně snadné: • Při každém přístupu uživatele na stránku s formulářem, kde hrozí vícenásobné odeslání, je vygenerován unikátní identifikátor, který je vložen do skrytého formulářového pole (hidden). • V případě, že byla data odeslána, identifikátor obsažený ve skrytém poli je přiřazen do SESSION uživatele, kde zůstává uložen. • Pokud uživatel stránku načte znovu, dojde ke kontrole, zda se hodnota identifikátoru v SESSION shoduje s hodnotou identifikátoru ve skrytém poli. Pokud se shodují, formulář už odeslán byl a není zpracován. 5.1.4 Komentářový spam Za komentářový nebo také diskusní spam je považováno vkládání reklamních, nevyžádaných, obtěžujících či s tématem nesouvisejících příspěvků do volně dostupných diskusních fór, knih návštěv, apod. Protože vložení příspěvku je poměrně jednoduché, vkládají někteří uživatelé do diskusí reklamy na svoje produkty nebo vlastní stránky. V současné době je problémem zejména automaticky vkládaný komentářový spam, a to pro jeho velký objem. Automaticky vkládaný spam je do diskusí a komentářů vkládán pomocí robotů – počítačových programů, které procházejí webové stránky a snaží se vkládat spam do dostupných formulářů. Robot je schopen v krátkém čase obejít velké množství stránek a tam spam vložit. Rozšířenými způsoby řešení jsou: • • •
Moderování příspěvků – vložené příspěvky se zobrazí až po schválení administrátorem. Tento způsob ochrany před spamem je velice účinný, ale snižuje interaktivitu diskuse. Povinná registrace uživatelů – ztíží vkládání automatického spamu, nebrání však vkládání spamu uživatelem V případě problémů je však možné uživateli odepřít přístup. CAPTCHA (Completely Automated Public Turing test to tell Computer and Humans Apart) – jedná se o Turingův test, který se používá ve snaze odlišit skutečného uživatele od robota. Test zpravidla spočívá v zobrazení obrázku s deformovaným textem, přičemž úkolem uživatele je zobrazený text opsat do příslušného vstupního políčka. Textová metoda CAPTCHA po uživateli požaduje 25
odpověď na určitou otázku. (např. kolik je 2+3). CAPTCHA zabraňuje pouze automaticky vkládanému spamu. Pro ochranu systému proti komentářovému spamu jsem vytvořil řešení, jehož základem je textová metoda CAPTCHA požadující odpověď na otázku. Textová metoda CAPTCHA má však několik nevýhod: • • •
Vyžaduje od uživatele určité znalosti (problém vzdělání a kulturního prostředí) Odpověď na otázku může být nejednoznačná (k čištění zubů používáte …) Uživatelé nemusí jazyku, v kterém je otázka položena rozumět
Ve svém řešení jsem zadávání odpovědi obešel pomocí JavaScriptu. Prohlížeče dnes mají interprety jazyka JavaScript na mnohem vyšší úrovni než roboti. Roboti tak nezvládají složitější metody JavaScriptu – konkrétně jsem použil metodu getElemenById, která přistupuje k objektu s určitou hodnotou atributu id. Pro studium pokročilých metod JavaScriptu vřele doporučuji knihu Davida Flanagana [5]. Ochrana proti spamu vypadá takto: • • • •
Do formuláře, který může být ohrožen komentářovým spamem, se přidá pole s ověřující otázkou. JavaScriptem je pole vyplněno správnou odpovědí a je skryto Uživatel, který má funkční JavaScript, tedy pole s ověřující otázkou a správná odpověď se odešle, aniž by o tom věděl. Robotu nebo uživateli s vypnutým JavaScriptem se pole s ověřující otázkou zobrazí. Uživatel zodpovězení otázky zvládne, robot nikoliv.
6. Testování Systém jsem testoval především z hlediska bezpečnosti. Vyzkoušel jsem řadu na internetu popsaných metod SQL injection pro proniknutí do databáze a neoprávněnému přístupu k systému. Ani jedna z vyzkoušených metod nevedla k úspěšnému proniknutí do databáze. Mou velkou výhodou oproti možným útočníkům přitom byla znalost struktury databáze, jejích tabulek a použitých datových typů. V praxi útočník takové informace nemá a průnik do databáze je pro něj mnohem složitější. Systém prokázal odolnost proti SQL injection útokům. Dalším možným bezpečnostním rizikem je předávání parametrů mezi skripty v rámci URL. Hodnoty parametrů jsou snadno upravitelné a jejich vhodná úprava u nezabezpečených stránek může vést k nepředpokládanému chování systému. Všechny skripty, kterým jsou data předávána v rámci URL, obsahují kontrolu správného tvaru parametrů. Zabezpečení proti nabourání systému předáním parametru s nesprávnou hodnotou jsem zkoušel nahrazením hodnot parametrů řetězcem složeným z náhodné posloupnosti znaků převedeným do podoby použitelné v URL. Systém na zadání chybných hodnot reagoval korektně – systém se nedostal do nepředpokládaného stavu. Podstatnou část systému tvoří formuláře, pomocí kterých se manipuluje s daty uloženými v databázi. Aby nedošlo k vložení nesprávných hodnot do databáze jsou formulářové vstupy před jejich odesláním kontrolovány. Odhalení nesprávného vstupu jsem testoval stejným způsobem jako u parametrů URL vkládáním náhodné
26
posloupnosti znaků. Ve všech případech došlo k odhalení nesprávného vstupu. Mechanismy zabraňující vícenásobnému odeslání formulářů také fungují spolehlivě Do databáze je možno vkládat v rámci některých polí speciální znaky HTML. Při jejich zobrazení může dojít k narušení kódu. Do databáze jsem v rámci testování vkládal části zdrojových kódů skriptů. Všechny speciální znaky byly díky zabezpečení interpretovány jako obyčejné znaky a nedošlo k narušení kódu ani struktury stránek. Pro účely testování veřejností jsem zkušební verzi systému umístil na server Webzdarma (http://cms.webzdarma.cz) , který zdarma nabízí hosting stránek na webovém serveru Apache (verze 2.0.48) s podporou PHP (verze 4.3.4) a databází MySQL (verze 4.1.20). Vytvořený systém neobsahuje nástroje pro zjišťování statistik návštěvnosti, využil jsem tedy služeb serveru TOPlist, který umožňuje zaznamenávání počtu návštěv z unikátních IP adres, ale i počtu jednotlivých shlédnutí stránek.
7. Závěr Cílem práce bylo vytvořit redakční systém pro specializovaný ekonomický portál. Výsledkem práce je funkční, stabilní systém vytvořený v souladu s moderními trendy web-designu a standardy zabezpečení, který splňuje cíle, které jsem si v úvodu vymezil. Systém je použitelný pro různé portály se specifickým zaměřením. Systém bude nasazen v praxi ke správě konkrétního portálu zabývajícím se moderními formami investování na kapitálovém trhu, jehož cílem je sdružovat odborníky v této oblasti a poskytnout jim nástroj pro výměnu názorů a sdílení jejich zkušeností.
27
28
8. Seznam literatury [1] W3C – World Wide Web Consortium – hlavní stránka. http://www.w3.org [2] OpenSourceCMS – hodnocení redakčních systémů. http://www.opensourcecms.com [3] Pokorný, J., Halaška, I.: Databázové systémy. Skripta FEL ČVUT, Vydavatelství ČVUT 2003 [4] Kosek, J.: PHP tvorba interaktivních aplikací. Grada Publishing 1999 [5] Flanagan, D.: JavaScript - kompletní průvodce 2 – aktualizované vydání. Computer Press 2002 [6] Staníček, P.: CSS Kaskádové styly – kompletní průvodce. Computer Press 2003
29
30
A Seznam použitých zkratek ASCII American Standard Code for Information Interchange ASP Active Server Pages BSD Berkeley Software Distribution CAPTCHA Completely Automated Public Turing test to tell Computer and Humans Apart CGI Common Gateway Protocol CMS Content Management Systém CSS Cascading Style Sheets DHTML Dynamic Hypertext Markup Language DOM Document Object Model DTD Dokument Type Definition FI Form Interpreter FK Foreign Key FTP File Transfer Protocol GPL General Public Licence HTML Hypertext Markup Language HTTP Hypertext Transfer Protocol IIS Internet Information Services ISAPI Internet Server Application Programming Interface JVM Java Virtual Machine MSDE Microsoft Data Engine ODBC Open Database Connectivity OS Operační Systém OSS Open-Source Software PHP PHP Hypertext Preprocessor POP3 Post Office Protocol version 3 SEO Search Engine Optimalization SGML Standard Generalized Markup Language SMTP Simple Mail Transfer Protocol SQL Structured Query Language SŘBD Systém Řízení Báze Dat URL Uniform Resource Locator UTF UCS Transformation Format VBScript Visual Basic Script W3C World Wide Web Consortium XHTML Extensive Hypertext Markup Language XML Extensible Markup Language
31
B Relační model databáze Zkratka FK u některých polí tabulek označuje cizí klíč (Foreign Key).
Příloha Obr. 1 – Relační model databáze
32
C Instalační příručka Vytvořený systém ke svému běhu vyžaduje webový server Apache, skriptovací jazyk PHP a databázový server MySQL. Jednotlivé programy jsou zdarma k dispozici na internetu. Webový server Apache - http://httpd.apache.org - poslední verze 2.2.3 Databázový server MySQL - http://www.mysql.com – poslední verze 5.0 PHP - http://www.php.net - poslední verze 5.1.5 Vzhledem k tomu, že systém je určen k provozu na serverech třetích stran, kde jsou tyto programy již nainstalovány, nebudu se zde zabývat popisem jejich instalace a nastavení. Méně zkušeným uživatelům, kteří chtějí systém provozovat na svém vlastním počítači, doporučuji instalaci prostřednictvím balíčků, které všechny požadované programy obsahují. Výhodou balíčků je snadná instalace a nastavení programů, takže povětšinou už není třeba nic předělávat. Zejména bych doporučil „Intranetový server“ od Miloslava Ponkráce, který lze stáhnout na adrese (http://www.slunecnice.cz). Kromě webového serveru Apache, PHP a databázového serveru MySQL obsahuje balíček také nástroj phpMyAdmin pro snadnou správu databáze. Druhým krokem při instalaci systému je nakopírování všech potřebných souborů systému na počítač, kde bude systém provozován. Potřebné soubory jsou umístěny v adresáři „BP-Source“. Pro správné fungování systému je nezbytně nutné zachovat adresářovou strukturu a soubory nepřesouvat jinam. Posledním krokem po nakopírování souborů na server, je vytvoření struktury databáze importováním souboru „cms.sql“ do databáze a změna přihlašovacích údajů pro připojení ke konkrétní databázi v souboru „dbconnect.php“.
33
D Uživatelská příručka D.1
Hlavní stránka redakčního systému
Hlavní stránka zobrazuje seznam nejaktuálnějších článků seřazených sestupně dle data vložení. Výběrem titulku článku se uživateli zobrazí celý článek. Pod ukázkou článku se nachází datum vložení článku, jméno redaktora a počet komentářů k danému článku. Při výběru jména redaktora se uživateli zobrazí všechny články od daného redaktora. V levé části stránky se nachází seznam hlavních rubrik článků – v závorce je uveden počet článků v rámci dané rubriky a jejích podrubriky. Výběrem určité rubriky se uživateli zobrazí všechny články patřící do dané rubriky a rovněž všechny její podrubriky. Pod seznam rubrik je odkaz pro přesun do diskusního fóra. V pravé části se nachází formulář pro přihlášení uživatele do systému. Odkazy v liště pod titulkem stránky se mění podle toho, zda je uživatel přihlášen a podle uživatelské role. Nepřihlášený uživatel má možnost registrace. Při zápisu do pole pro heslo se zobrazují náhradní znaky.
Příloha Obr. 2 – Hlavní stránka redakčního systému – uživatel nepřihlášen
34
Po přihlášení do systému zmizí přihlašovací formulář. V liště v horní části stránky je možné vidět odkaz „Přidat článek“, který se zobrazuje pouze redaktorům a administrátorům a umožní jim vstup do části redakčního systému pro přidávání článků. Pro všechny přihlášené uživatele do lišty přibyla možnost odhlášení pomocí odkazu „Odhlásit“.
Příloha Obr. 3 – Hlavní stránka redakčního systému – uživatel přihlášen
D.2
Výpis článků autora
Výpisu všech článků od daného autora.
Příloha Obr. 4 – Výpis článků autora
35
D.3
Zobrazení článku
V hlavní oblasti stránky se nachází celý text článku, spolu s titulkem článku, jménem redaktora, který článek do systému vložil a datem vložení. První zvýrazněný odstavec textu slouží jako ukázka článku ve výpisech článků. V liště nad titulkem článku je zobrazena rubrika do které článek patří. V dolní části se nachází odkaz „Komentáře k článku“ který uživatele přenese na stránku s komentáři.
Příloha Obr. 5 – Zobrazení článku
D.4
Vložení článku
Formulář pro vložení článku do redakčního systému. Přístup k tomuto formuláři mají pouze redaktoři a administrátoři.
Příloha Obr. 6 – Vložení článku do redakčního systému
36
Hlavní stránka diskusního fóra V levé části stránky se nachází seznam hlavních diskusních kategorií. Číslo v závorce vedle názvu kategorie je počet diskusních témat v dané kategorii a jejích podkategoriích. Po výběru kategorie se zobrazí její podkategorie a diskusní témata, která do této kategorie patří. Obsah lišty pod titulkem stránky se stejně jako u redakčního systému mění podle toho, zda je uživatel přihlášen. Odkaz „Zpět na hlavní stránku“ v dolní části přesune uživatele do redakčního systému. Pokud uživatel není přihlášen, je v dolní části stránky formulář pro přihlášení do systému.
Příloha Obr. 7 – Hlavní stránka diskusního fóra – uživatel přihlášen
Po výběru kategorie se zobrazí její podkategorie a diskusní témata, která do této kategorie patří. U jednotlivých témat diskuse se uveden počet příspěvků. Výběrem určitého tématu se uživateli zobrazí výpis příspěvků.
Příloha Obr. 8 – Výpis podkategorií a témat zvolené kategorie
37
D.5
Výpis příspěvků
V hlavní oblasti stránky se kromě názvu diskusního tématu a počtu příspěvků nachází také odkaz „Přidat příspěvek“, který se zobrazí jen přihlášeným uživatelům a umožní jim přispět do diskusního tématu. Nejdůležitějším na stránce je však výpis příspěvků. V hlavičce každého příspěvku je uvedeno uživatelské jméno uživatele, který příspěvek vložil, datum vložení příspěvku a titulek. V pravé části hlavičky se nacházejí odkazy pro úpravu a vymazání příspěvku. Tyto odkazy se zobrazí pouze u příspěvků, které byli přidány aktuálně přihlášeným uživatelem. Výběrem uživatelského jména v hlavičce příspěvku se uživateli zobrazí profil uživatele, který příspěvek vložil. Tělo příspěvku tvoří ikonka uživatele vedle níž se nachází samotný text příspěvku.
Příloha Obr. 9 – Výpis příspěvků
Příloha Obr. 10 – Profil uživatele
38
D.6
Vložení příspěvku
Formulář pro vložení příspěvku do diskusního tématu. Přístup k tomuto formuláři mají pouze přihlášení uživatelé.
Příloha Obr. 11 – Vložení příspěvku
D.7
Registrace uživatele
Formulář pro registraci nového uživatele do systému. Při zápisu do polí pro heslo se zobrazují náhradní znaky.
Příloha Obr. 12 – Registrace uživatele
39
D.8
Nastavení
V nastavení lze měnit údaje o uživateli. Uživatel má možnost změny přístupového hesla k systému a změny osobních údajů.
Příloha Obr. 13 – Nastavení přístupového hesla
Příloha Obr. 14 – Nastavení osobních údajů uživatele
40
E Obsah přiloženého CD ├ BP-2006-zikanj2.doc ├ BP-2006-zikanj2.pdf └ BP-Source ├ favicon.ico ├ form.js ├ autor.php ├ clanek.php ├ clanek_pridat.php ├ index.php ├ komentar.php ├ komentar_pridat.php ├ .htaccess ├ cms.sql └ css ├ design.css ├ error.css ├ form.css └ error ├ 400.html ├ 401.html ├ 402.html ├ 403.html └ forum ├ index.php ├ login.php ├ nastaveni.php ├ nastavit_heslo.php ├ nastavit_osobni.php ├ prispevek.php ├ registrace.php ├ tema.php ├ uzivatel.php └ images └ avatars └ default.gif └ emoticons ├ emo-happy.gif ├ emo-laughing.gif ├ emo-sad.gif ├ emo-winking.gif └ inc ├ dbconnect.php ├ functions.php └ reg_validate.php
dokumentace bakalářské práce dokumentace bakalářské práce + adresář se soubory a zdrojovými soubory práce ikonka zobrazující se v prohlížeči skript jazyka JavaScript pro obsluhu formulářů PHP skript – redakční systém PHP skript – redakční systém PHP skript – redakční systém PHP skript – redakční systém PHP skript – redakční systém PHP skript – redakční systém nastaveni vlastností serveru SQL skript pro vytvoření tabulek databáze adresář s kaskádními styly CSS – hlavní definice vzhledu CSS – vzhled error stránek CSS – definice vzhledu formulářů + adresář s chybovými stránkami
+ PHP skripty PHP skript – diskusní fórum PHP skript – přihlášení do systému PHP skript – nastavení PHP skript – nastavení hesla PHP skript – nastavení osobních údajů uživatele PHP skript – diskusní fórum PHP skript – registrace uživatele PHP skript – diskusní fórum PHP skript – diskusní fórum + adresář s obrázky + ikonky uživatelů výchozí ikonka + grafické emotikony
+ adresář se začleňovanými PHP skripty PHP skript – funkce pro práci s databází PHP skript – funkce pro obecné použití PHP script – kontrola registračních údajů
41