LINUXSOFT.cz Přeskoč levou lištu
Uživatel: Heslo:  
   CZUKPL

> PHP (84) - Ještě k registraci

Chybovati je lidské, aneb proč se někteří uživatelé nemohli na náš cvičný portál registrovat.

29.12.2004 15:00 | Petr Zajíc | Články autora | přečteno 29755×

Komerční sdělení: Pořádáme Kurzy PHP

Dnes budeme řešit záležitost mimo plán - i takové věci se při vývoji software stávají. Budeme řešit reálný problém, který vznikl s registrací na tomto cvičném portálu. Je to naléhavé, protože většina věcí bez funkčního přihlašování nejde vyzkoušet.

Problém s přihlašováním

Pravděpodobně si vzpomínáte, že registrační skript generoval e-mail, který obsahoval instrukce k dokončení registrace. Vtip spočívá v tom, že uživatel si musí e-mail stáhnout a zařídit se podle instrukcí v něm obsažených. To v našem případě reprezentuje kliknutí na odkaz. A ten vede na stránku pro dokončení registrace. Pro osvěžení kód, který mail generuje:

  $path="http://".$_SERVER["SERVER_NAME"].":".$_SERVER["SERVER_PORT"].$_SERVER["SCRIPT_NAME"].
  
"?clanek=registracedokoncena&id=".$lastid."&email=".$_POST["email"];
  
$telo = "Dekujeme Vam za registraci na nasem portale [nazev hudebniho portalu]. Pro dokonceni ".
  
"registrace klepnete na nasledujici odkaz\n<a href=\"$path\">$path</a>\n".
  
"Pokud jste se na nasem portale nechteli zaregistrovat, povazujte tento e-mail za bezpredmetny.\n".
  
"Vas [nazev hudebniho portalu] team.";
  @
mail ($_POST["email"], "Registrace na portalu", $telo);

V kódu nebylo nic závadného, a nic závadného nebylo ani v kódu, který registraci dokončuje:

  mysql_query("update uzivatele set registracedokoncena=1 where id=".$_GET["id"]." and email='".$_GET["email"]."';",$GLOBALS["link"]);
  echo
"Vaše registrace byla dokončena."

Přes to přeze všechno kód některým uživatelům nefungoval. Jak se zdá, je to proto, že v proměnné $path je použito znaků, &amp; jako entity ampersandu. Je tomu tak proto, že to vyžaduje norma a je to jistě správně. Někteří e-mailový klienti však mají se zpracováním takto napsaných odkazů problém a hodnoty parametrů clanek, id a email jsou předávány špatně nebo vůbec.

Řešení jsou v podstatě tři. Je možné:

  1. Místo &amp; psát pouze ampersand. To nechceme, není to podle normy.
  2. Přepsat portál tak, aby odkaz na registraci nevyžadoval. To je v našem případě poměrně problematické, protože by to znamenalo změnit celou logiku zpracování registrace.
  3. Přestat používat ve zprávě HTML tagy a posílat ji jako prostý text

My se pustíme tím třetím směrem a přepíšeme text zprávy tak, aby neobsahoval žádné HTML tagy. Neboli, ze zprávy ve formátu HTML uděláme zprávu ve formátu "prostý text". Sice to znamená, že uživatel nebude moci pohodlně dokončit registraci kliknutím na odkaz ve svém e-mailovém klientovi, ale:

  • Zato to bude fungovat se všemi e-mailovými klienty včetně těch, kteří odkazy nepodporují
  • Většina pošťáků si stejně bude hrát na chytré a odkaz z toho vytvoří. Doufejme, že správný.

Chyba plodí chybu

Aby toho nebylo málo, ukázalo se zároveň, že informační hláška po dokončení registrace "Vaše registrace byla dokončena" je v případě problémů s posíláním parametrů v odkazech v podstatě nesmyslná. Informuje nás totiž o něčem, co není pravda. Abychom měli jistotu, že se dotaz skutečně podařilo v databázi provést, měli bychom udělat nějaké testy. Tak například bychom mohli testovat, zda se tím příkazem změnil právě jeden řádek v databázi. Pokud se tak nestalo (nejspíš proto, že dotaz neaktualizoval žádný řádek), neměli bychom tvrdit, že "registrace byla dokončena". Úprava může spočívat v následujícím kódu:

  if (mysql_affected_rows()==1) echo "Vaše registrace byla dokončena.";
  else echo
"Příkaz nebyl proveden, zřejmě jsou nesprávné parametry nebo již registrace byla dokončena";

Funkce mysql_affected_rows se zhruba podobná funkci mysql_num_rows až na to, že se používá pro zjišťování počtu řádků ovlivněných akčními dotazy, kdežto mysql_num_rows je pro počet řádků vrácených výběrovými dotazy.

Pozn.: Akční dotazy jsou takové, které mění stávající data. Jako například INSERT, UPDATE, DELETE a některé další. Výběrové dotazy jsou ty, začínající slovem SELECT.

Je to bezpečné?

Tak, chyba byla zažehnána. Když už jsme u registrace, nabízí se ještě jedna otázka: Je posílání identifikačního čísla a e-mailu uživatele bezpečné? Diplomatická odpověď je ta, že ne až tak úplně. Při troše důvtipu by totiž mohl útočník vyzkoušet různé kombinace parametrů id a při troše štěstí by se mu mohlo povést dokončit registraci i v případě, že by daný e-mail vůbec neexistoval! Navíc by každý, kdo by se dostal k přenášené poště mohl ze zprávy vyčíst identifikátor a e-mailovou adresu právě přihlašovaného uživatele.

Pozn.: Nám by to na testovacím portále sice zase až tak nevadilo, ale v praxi by mohlo být ověření funkční adresy pro portál klíčové a možnost zaregistrovat se bez uvedení platného e-mailu by mohla mít fatální důsledky. Stejně fatální by mohlo být vyluštění citlivých informací z e-mailu.

Tak či tak, nastíníme si řešení, které má oproti našemu současnému dvě podstatné výhody:

  1. Namísto dvou parametrů id a email se skriptu posílá pouze jeden parametr. Ne snad, že by to vyřešilo problémy s ampersandy ve zprávě, ale bude to kompaktnější.
  2. Přenášený údaj bude zašifrovaný a bude mu rozumět zase jen registrační skript

Dosáhnout toho není zas až tak složité, jak by se mohlo na první pohled zdát. Pokud využijeme poznatky z 51.dílu našeho seriálu o předávání dat pomocí parametrů, máme prakticky vystaráno. Kód by mohl vypadat nějak takto:

  $sifra= new Crypt_Xtea;
  
$citlive=$lastid."|".$_POST["email"];
  
$citlive=urlencode(base64_encode($sifra->encrypt((string)$citlive, "[šifrovací klíč]")));

Telegraficky řečeno využívá se šifrování pomocí třídy Crypt_Xtea. Parametry se spojí do jednoho a zašifrují. Použití znaku "|" jako oddělovače je bezpečné, protože ani identifikátor ani e-mail jej nebudou obsahovat. Skript pro dokončení registrace pak může vypadat nějak takto:

  $sifra= new Crypt_Xtea;  
  
$citlive=$sifra->decrypt(base64_decode(urldecode($_GET["id"])),"[šifrovací klíč]");
  
$udaje=explode("|",$citlive);

... a následuje zápis do databáze, jak jej známe. Přičemž klíč musí být pochopitelně stejný jako ten, který jsme použili při šifrování. Proč jsou tam zahrnuty funkce base64_encode, base64_decode, urlencode a urldecode se dozvíte v 51. díle, kde je to rozebráno podrobněji. Zkráceně řečeno je to proto, aby se řetězec bezpečně přenesl jako text, přestože může být binární.

Poděkování za objev "zakopaného psa" patří Honzovi Houšťkovi, který přišel na to, že problémy při dokončování registrace způsobují mechanizmy, kterými někteří e-mailoví klienti zpracovávají odkazy v HTML zprávách.

Úloha komunity

V tomto bodě se hodí připomenout výhody sdílení kódu s jinými vývojáři, snad pod nějakou svobodnou licencí. Mají-li totiž ostatní přístup k tomu, co vyvíjíte, mohou se podobné problémy objevit a vyřešit mnohem pravděpodobněji, než když na projektu pracuje jeden vývojář nebo jen uzavřená skupina lidí. Proto byste při vývoji vlastního software měli minimálně uvažovat o tom, zda a za jakých podmínek by bylo možné zpřístupnit vaši práci ostatním vývojářům. GNU/Linux je na tomto principu založen a funguje. Nemá to nic společného s tím, zda za svou práci budete chtít peníze či nikoli; více se můžete dozvědět studiem příslušných licencí. Každopádně pozitivní vliv spolupráce více lidí při tvorbě kódu je nesporný.

Změny na portále

Především, všechny nedokončené žádosti o registraci byly z databáze odstraněny, takže se můžete znovu registrovat, pokud to předtím nefungovalo. Byly změněny soubory registrace.php a registracedokoncena.php. A byly přidány moduly pro šifrování. Na současný stav portálu se na našem webu můžete podívat, nebo si jej můžete stáhnout ve formátu zip.

Verze pro tisk

pridej.cz

 

DISKUZE

update 0 - 1 4.1.2007 08:39 onza
  L Re: update 0 - 1 4.1.2007 09:23 onza




Příspívat do diskuze mohou pouze registrovaní uživatelé.
> Vyhledávání software
> Vyhledávání článků

15.5.2017 23:50 /František Kučera
Máš rád svobodný software a hardware nebo se o nich chceš něco dozvědět? Zajímá tě DIY, CNC, SDR nebo morseovka? Přijď na sraz spolku OpenAlt, který se bude konat ve čtvrtek 18. května od 18:00 v Radegastovně Perón (Stroupežnického 20, Praha 5).
Přidat komentář

12.5.2017 16:42 /Honza Javorek
PyCon CZ, česká konference o programovacím jazyce Python, se po dvou úspěšných ročnících v Brně bude letos konat v Praze, a to 8. až 10. června. Na konferenci letos zavítá např. i Armin Ronacher, známý především jako autor frameworku Flask, šablon Jinja2/Twig, a dalších projektů. Těšit se můžete na přednášky o datové analytice, tvorbě webu, testování, tvorbě API, učení a mentorování programování, přednášky o rozvoji komunity, o použití Pythonu ve vědě nebo k ovládání nejrůznějších zařízení (MicroPython). Na vlastní prsty si můžete na workshopech vyzkoušet postavit Pythonem ovládaného robota, naučit se učit šestileté děti programovat, efektivně testovat nebo si v Pythonu pohrát s kartografickým materiálem. Kupujte lístky, dokud jsou.
Přidat komentář

2.5.2017 9:20 /Eva Rázgová
Putovní konference československé Drupal komunity "DrupalCamp Československo" se tentokrát koná 27. 5.2017 na VUT FIT v Brně. Můžete načerpat a vyměnit si zkušenosti z oblasti Drupalu 7 a 8, UX, SEO, managementu týmového vývoje, využití Dockeru pro Drupal a dalších. Vítáni jsou nováčci i experti. Akci pořádají Slovenská Drupal Asociácia a česká Asociace pro Drupal. Registrace na webu .
Přidat komentář

1.5.2017 20:31 /Pavel `Goldenfish' Kysilka
PR: 25.5.2017 proběhne v Praze konference na téma Firemní informační systémy. Hlavními tématy jsou: Informační systémy s vlastní inteligencí, efektivní práce s dokumenty, mobilní přístup k datům nebo využívání cloudu.
Přidat komentář

15.4.2017 15:20 /František Kučera
Máš rád svobodný software a hardware nebo se o nich chceš něco dozvědět? Zajímá tě IoT a radiokomunikace? Přijď na sraz spolku OpenAlt, který se bude konat ve středu 19. dubna od 18:30 v Šenkovně (Sokolská 60, Praha 2).
Přidat komentář

5.3.2017 19:12 /Redakce Linuxsoft.cz
PR: 23. března proběhne v Praze konferenci na téma Cloud computing v praxi. Hlavními tématy jsou: Nejžhavější trendy v oblasti cloudu a cloudových řešení, Moderní cloudové služby, Infrastruktura současných cloudů, Efektivní využití cloudu, Nástrahy cloudových řešení a jak se jim vyhnout.
Přidat komentář

27.2.2017 22:12 /František Kučera
Pozvánka na 137. sraz OpenAlt – Praha: Tentokrát jsme si pro vás připravili neobvyklou akci. Ve středu 1.3. v 17:30 nás přivítá sdružení CZ.NIC ve svých prostorách v Milešovské ulici číslo 5 na Praze 3, kde si pro nás připravili krátkou prezentaci jejich činnosti. Následně navštívíme jejich datacentrum pod Žižkovskou věží. Provedou nás prostory, které jsou běžnému smrtelníkovi nedostupné!
Po ukončení prohlídky se všchni odebereme do hostince U vodoucha, Jagelonská 21, Praha 3 pochutnat si na některém z vybraných piv či dát si něco na zub. Rezervaci máme od 19:30, heslo je OpenAlt.
Ale pozor! Do prostor datového centra máme omezený přístup, dostane se tam pouze 10 lidí! Takže kdo přijde dříve, ten má přednost, a občanky s sebou! Kdo nebude chtít na prohlídku datového centra, může se pomalu přesunout do hostince U vodoucha a u nepřeberné nabídky piv počkat na ostatní.
Přidat komentář

18.1.2017 0:49 /František Kučera
Členové a příznivci spolku OpenAlt se pravidelně schází v Praze a Brně. Fotky z pražských srazů za uplynulý rok si můžete prohlédnout na stránkách spolku. Příští sraz se koná už 19. ledna – tentokrát je tématem ergonomie ovládání počítače – tzn. klávesnice, myši a další zařízení. Také budete mít příležitost si prohlédnout pražský hackerspace Brmlab.
Přidat komentář

   Více ...   Přidat zprávičku

> Poslední diskuze

15.6.2017 9:34 / Ondřej Havlas
php,

10.6.2017 10:39 / Temple
sell home for cash

11.5.2017 23:32 / lelo
Re: Problém se správcem balíčků

11.5.2017 5:45 / davd mašek
Re: Problém se správcem balíčků

10.5.2017 22:54 / lelo
Re: Problém se správcem balíčků

Více ...

ISSN 1801-3805 | Provozovatel: Pavel Kysilka, IČ: 72868490 (2003-2017) | mail at linuxsoft dot cz | Design: www.megadesign.cz | Textová verze