Hruška smrdí

Pár dní zpět ke mně dorazila prakticky neodmítnutelná zakázka ze západu, týkající se vytvoření patrně části administrace redakčního systému. Oč konkrétně jde není pro tento článek příliš relevantní, důležité je, že součástí tohoto skriptu má být autentizační systém (česky přihlašování). Smutnou podmínkou též je nutnost mít skript v PHP s využitím MySQL. Inu, směle do toho a s hruškou je půl hotovo. Nebo ne?

Předně, o jaké hrušce to celou dobu mluvím? O projektu PEAR, tedy jakémsi repozitáři „již napsaného“. Vybral jsem si z něj balíček Auth, který by pro mé účely mohl být tím pravým mandlovým a rovnou stáhl i potřebné závislosti, tedy balíček MDB2 pro práci s databází a potřebnou rutinu PEAR, bez té by to moc nefungovalo. Vyťukám tři magické řádky… a ouha!

require_once("includes/pear/PEAR.php");
require_once("includes/mdb2/MDB2.php");
require_once("includes/auth/Auth.php");

Balíčky se nejspíše spoléhají na debilitu programátora a snaží se includovat své závislosti po svém – což se jim moc dobře nemůže podařit, když jsem si pro ně vymyslel takovou krásnou adresářovou strukturu. Půl hodiny laboruji, kde, co, kdy a jak, až vymyslím funkční řešení – tedy částečně. Balíčky umístím do root adresáře skriptu a použiji tento kód.

set_include_path("Auth/" .PATH_SEPARATOR. "MDB2/" .PATH_SEPARATOR. "PEAR/" .PATH_SEPARATOR. get_include_path());
require_once("PEAR.php");
require_once("MDB2.php");
require_once("Auth.php");

Jasně, je to fuj a moc, ale po půlhodině jste rádi alespoň za takovéto řešení (nicméně pramálo to mění na mém strachu z budoucího přidávání dalších balíčků). Inu, to by tedy bylo, chyb o nemožnosti vložení jiného skriptu jsem si užil dosti a píši kód, který balíčku Auth vysvětlí, co a jak potřebuji – to je za chvíli hotovo, nicméně přes přihlašovací formulář se nikam dál nedostanu. Zrada. Stále dostávám návratový kód -3, což podle manuálu znamená, že jsem se patrně sekl v hesle. Zkouším do databáze heslo ukládat v MD5, SHA1, dokonce i v plaintextu, neb netuším, co za šifrování ode mě Auth očekává. Po vyzkoušení všech možných i nemožných kombinací jsem usoudil, že chyba bude jinde – a taky že ano. Přiznám se, netušil jsem, že více než 700 kB velká databázová vrstva bude ještě potřebovat ovladač pro každou použitou databázi. Jasně, kdybych použil PEARí instalátor, asi bych se těmto obstrukcím vyhnul, ale takový instalátor, přestože na lokálním stroji je to nejspíš moc fajn věc, je na vzdáleném stroji, ke kterému navíc nemáte shellový přístup, na dvě a půl věci. A instalovat tyhle balíčky přes PHP, což údajně taky jde, mi přijde jako zvrhlost.

Vraťme se ale zpět k balíčku Auth. Ten, přestože se na Vás zubí výrazem dávajícím jasně najevo, že „on je tady ten chytrej a já se nemusím o nic bát, neb on mi dá vědět, co se zeslonilo“, není schopen odlišit nemožnost připojení se k databázi od špatného uživatelského jména či hesla. Při běžném provozu to může být běžným uživatelům vcelku vy-víte-kde, obojí znepříjemní život, ale při vývoji je to přímo k vzteku, neboť nejen, že nevíte, kde je chyba, ale dokonce jste navedeni jiným směrem. A to teprve potěší.

A ještě něco, někde jsem četl, že v PEARu by mělo být všechno čisté, hezké, v jednom stylu. Oceňuji tuto snahu, neboť bordel v názvech funkcí v PHP nemá obdoby. Ale ten samý bordel v bledě modrém je i v PEARu! Vedle sebe, v jednom poli určeném pro konfiguraci, najdete tyto klíče pole: usernamecol (tedy malým vše a bez podtržítka), db_fields (taktéž malým, ale s podtržítkem) a cryptType (druhé slovo velkým). A teď mi, milostpáni, ukažte tu čistotu.

Ale což, alespoň jsem se naučil bufferovat výstup, neboť Auth balíček má ještě jednu malou chybku. Celý proces ověření autentizace je pochopitelně zapotřebí začít co nejvýše ve skriptu, vlastně by to měla být první věc, kterou uděláte. Pokud autentizace selže (uživatel není přihlášen), Auth vykreslí přihlašovací formulář. Logické, že? Ale krev Vám v žilách ztuhne, otevřete-li si zdrojový kód výsledné stránky. Jak jsem již řekl, ověření musí být nahoře ve skriptu, před jakýmkoliv výstupem. Počkat, před výstupem? Před deklarací DOCTYPE, před úvodem HTML dokumentu? Správně! To je, panečku, hnus. Takže si vyberte, buď bude formulář před tagem <html>, nebo se dočkáte zasloužené odměny – „Headers already sent“. Nebo se naučíte pracovat s funkcí `ob_start()`. Nebo upravíte funkci vypisující přihlašovací formulář, ale na to jsem byl – jak jinak – moc líný.

PHP zdar!


Average: 3.7 (3 hlasy/hlasů)

Komentáře

Re: Hruška smrdí

Hlavně že jabka voní Křenící se a mrkající (joke Křenící se)

Obrázek uživatele Miloso

Re: Hruška smrdí

No to si piš že jo! Křenící se Btw, gratuluju ke čtyřstému komentáři ;-)

Re: Hruška smrdí

PEAR je jako framework pro PHP celkově nepoužitelný, navíc je celkem blbost kvůli jedné třídě, kterou potřebuješ, linkovat 700 kB soubor. A možná než řešit všechny problémy s ním by bylo mnohem lepší si tu funkci napsat podle nějakého tutoriálu sám, něco by ses při tom naučil a navíc by to fungovalo přesně podle tvých představ.

Obrázek uživatele Miloso

Re: Hruška smrdí

Já vlastně nechtěl řešit přes PEAR jen autentizaci, říkal jsem si, že když už, tak už a použiju MDB2 pro veškerou práci s databází. No a autentizaci jsem sám nechtěl psát, neb jsem to již dělal tisíckrát, takže se nediv, že po tisící prvé na mě padla lenost :-)

Re: Hruška smrdí

Tak potom sis měl vybrat nějaký lepší a ne nějaký, který skoro nikdo nepoužívá a v poslední době není skoro vůbec aktualizován.

Obrázek uživatele Miloso

Re: Hruška smrdí

O Zend Frameworku už jsem toho hodně slyšel… Podívám se na něj, díky, ale mou volbu věnovat se Ruby on Rails to už asi nezmění :-)

Poslat nový komentář

Smajlíci
>:-P>:-(:-]:-?B-):-[>:-D:-(:-oX-(:-D;-DO:-):-*:-X>:-):-$>:-|:-!>:-O|-):-):->:-|:-P;-P;-):'-(:-\
Obsah tohoto pole je soukromý a nebude veřejně zobrazen.
  • K formátování a úpravě obsahu můžete použít Texy!
  • Textoví smajlíci budou nahrazeni jejich grafickými ekvivalenty.
  • Můžete citovat jiné příspěvky pomocí tagu [quote].

Více informací o možnostech formátování

CAPTCHA
Otázka sloužící k ověření, zda-li je pisatel člověk (alespoň biologicky) a zabránění automatickému spamování.
Image CAPTCHA
Zkopírujte znaky z obrázku, velikost písmen hraje roli.
Syndikovat obsah