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 34267×
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ů, & 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é:
- Místo & psát pouze ampersand. To nechceme, není to podle
normy.
- 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.
- 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:
- 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ší.
- 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
|
Příspívat do diskuze mohou pouze registrovaní uživatelé.
|
|
Vyhledávání software
Vyhledávání článků
28.11.2018 23:56 /František Kučera Prosincový sraz spolku OpenAlt se koná ve středu 5.12.2018 od 16:00 na adrese Zikova 1903/4, Praha 6. Tentokrát navštívíme organizaci CESNET. Na programu jsou dvě přednášky: Distribuované úložiště Ceph (Michal Strnad) a Plně šifrovaný disk na moderním systému (Ondřej Caletka). Následně se přesuneme do některé z nedalekých restaurací, kde budeme pokračovat v diskusi.
Komentářů: 1
12.11.2018 21:28 /Redakce Linuxsoft.cz 22. listopadu 2018 se koná v Praze na Karlově náměstí již pátý ročník konference s tématem Datová centra pro business, která nabídne odpovědi na aktuální a často řešené otázky: Jaké jsou aktuální trendy v oblasti datových center a jak je optimálně využít pro vlastní prospěch? Jak si zajistit odpovídající služby datových center? Podle jakých kritérií vybírat dodavatele služeb? Jak volit vhodné součásti infrastruktury při budování či rozšiřování vlastního datového centra? Jak efektivně datové centrum spravovat? Jak co nejlépe eliminovat možná rizika? apod. Příznivci LinuxSoftu mohou při registraci uplatnit kód LIN350, který jim přinese zvýhodněné vstupné s 50% slevou.
Přidat komentář
6.11.2018 2:04 /František Kučera Říjnový pražský sraz spolku OpenAlt se koná v listopadu – již tento čtvrtek – 8. 11. 2018 od 18:00 v Radegastovně Perón (Stroupežnického 20, Praha 5). Tentokrát bez oficiální přednášky, ale zato s dobrým jídlem a pivem – volná diskuse na téma umění a technologie, IoT, CNC, svobodný software, hardware a další hračky.
Přidat komentář
4.10.2018 21:30 /Ondřej Čečák LinuxDays 2018 již tento víkend, registrace je otevřená.
Přidat komentář
18.9.2018 23:30 /František Kučera Zářijový pražský sraz spolku OpenAlt se koná již tento čtvrtek – 20. 9. 2018 od 18:00 v Radegastovně Perón (Stroupežnického 20, Praha 5). Tentokrát bez oficiální přednášky, ale zato s dobrým jídlem a pivem – volná diskuse na téma IoT, CNC, svobodný software, hardware a další hračky.
Přidat komentář
9.9.2018 14:15 /Redakce Linuxsoft.cz 20.9.2018 proběhne v pražském Kongresovém centru Vavruška konference Mobilní řešení pro business.
Návštěvníci si vyslechnou mimo jiné přednášky na témata: Nejdůležitější aktuální trendy v oblasti mobilních technologií, správa a zabezpečení mobilních zařízení ve firmách, jak mobilně přistupovat k informačnímu systému firmy, kdy se vyplatí používat odolná mobilní zařízení nebo jak zabezpečit mobilní komunikaci.
Přidat komentář
12.8.2018 16:58 /František Kučera Srpnový pražský sraz spolku OpenAlt se koná ve čtvrtek – 16. 8. 2018 od 19:00 v Kavárně Ideál (Sázavská 30, Praha), kde máme rezervovaný salonek. Tentokrát jsou tématem srazu databáze prezentaci svého projektu si pro nás připravil Standa Dzik. Dále bude prostor, abychom probrali nápady na využití IoT a sítě The Things Network, případně další témata.
Přidat komentář
16.7.2018 1:05 /František Kučera Červencový pražský sraz spolku OpenAlt se koná již tento čtvrtek – 19. 7. 2018 od 18:00 v Kavárně Ideál (Sázavská 30, Praha), kde máme rezervovaný salonek. Tentokrát bude přednáška na téma: automatizační nástroj Ansible, kterou si připravil Martin Vicián.
Přidat komentář
Více ...
Přidat zprávičku
Poslední diskuze
31.7.2023 14:13 /
Linda Graham iPhone Services
30.11.2022 9:32 /
Kyle McDermott Hosting download unavailable
13.12.2018 10:57 /
Jan Mareš Re: zavináč
2.12.2018 23:56 /
František Kučera Sraz
5.10.2018 17:12 /
Jakub Kuljovsky Re: Jaký kurz a software by jste doporučili pro začínajcího kodéra?
Více ...
|