Autor | Zpráva | ||
---|---|---|---|
bicebs Profil |
Robím to podľa php série na linuxsofte a nevie kde som spravil chybu všetko okrem potvrdenia registrácie ide dobre ale keď kliknem na odkaz v maili na potvrdenie registrácie tak mi tam načíta registračný formulár. Registračný skript je novysubor1.php a skript na potvrdenie je registraciadokoncena.php. Obidva sú uložené iba tak v public_html. Je to chyba? Odkaz na registračný formulár http://velkybicebs.php5.sk/novysubor1.php
registračný skript <?php function JeEmail ($cislo) { return ereg("^.+@.+\..+$",$cislo); } function emailvdb ($email, $link) { $vysledek=mysql_query("select * from uzivatelia where email='".$email."'", $link); return (boolean) mysql_num_rows($vysledek); } function prezivkavdb ($prezivka, $link) { $vysledek=mysql_query("select * from uzivatelia where prezivka='".$prezivka."'", $link); return (boolean) mysql_num_rows($vysledek); } // tělo skriptu - nejprve si vytvoříme odkaz na databázi $link=mysql_connect("localhost:3306", "skvelkybicebs", "******")or die("Nelze se připojit k MySQL: " . mysql_error()); mysql_select_db("skvelkybicebs",$link)or die("Nelze vybrat databázi: ". mysql_error()); mysql_query("SET NAMES 'utf8'"); $BudemeZobrazovat=true; if (!empty($_POST)) // už se odeslalo { /* budeme kontrolovat následující věci: 1) e-mailovou adresu 2) zda tam již e-mail není 3) zda tam již přezdívka není 4) zda je přezdívka mezi 3 a 50 znaky délky 5) zda je heslo 3 až 50 znaků dlouhé */ if (!JeEmail($_POST["email"])) echo "Není zadán platný e-mail"; elseif (emailvdb($_POST["email"], $link)) echo "Uvedený e-mail je již registrován"; elseif (prezivkavdb ($_POST["prezivka"], $link)) echo "Uvedená přezdívka je již registrována"; elseif ((strlen ($_POST["prezivka"])>50) | strlen ($_POST["prezivka"])<3)echo "Přezdívka musí mít 3-50 znaků"; elseif ((strlen ($_POST["heslo"])>50) | strlen ($_POST["heslo"])<3) echo "Heslo musí mít 3-50 znaků"; else { // kontolou jsme prošli $BudemeZobrazovat=false; // poděkujeme uživateli echo "Děkujeme za registraci. Na vaši adresu ".$_POST["email"]." byly zaslány informace pro její dokončení."; // uložíme to do databáze mysql_query ("insert into uzivatelia (email, prezivka, heslo) values ('".$_POST["email"]."', '".$_POST["prezivka"]."', '".$_POST["heslo"]."');", $link); $lastid=mysql_insert_id(); // a sestavíme e-mail s instrukcemi, jak registraci dokončí $path="http://" . $_SERVER["SERVER_NAME"] . ":" . $_SERVER["SERVER_PORT"] . $_SERVER["SCRIPT_NAME"] . "?clanok=registraciadokoncena&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."; $hlavicky="From: ".$_POST["email"]."\nReturn-Path:".$_POST["email"]; @mail($_POST["email"], "Registrace na portalu", $telo, $hlavicky, "-f ".$_POST["email"]); } } if ($BudemeZobrazovat):?> <form method="post" action="novysubor1.php"> <table> <tr> <td>Přezdívka:</td> <td><input name="prezivka" value="<?echo $_POST["prezivka"]?>"></td> </tr> <tr> <td>E-mail:</td> <td><input name="email" value="<?echo $_POST["email"]?>"></td> </tr> <tr> <td>Heslo:</td> <td><input name="heslo" type = "password" value="<?echo $_POST["heslo"]?>"></td> </tr> <tr> <td colspan="2"><input type="Submit" name="odesli" value="Zaregistrovat"></td> </tr> </table> </form> <?endif;?> <?php $link=mysql_connect("localhost:3306", "skvelkybicebs", "*****"); mysql_select_db("skvelkybicebs"); mysql_query("SET NAMES 'utf8'"); mysql_query("update uzivatelia set registraciadokoncena=1 where id=".$_GET["id"]." and email='".$_GET["email"]."';"); echo "Vaše registrace byla dokončena." ?> |
||
Fisir Profil |
#2 · Zasláno: 10. 6. 2014, 17:59:47
Reaguji na bicebse:
Vyhvězdičkuj hesla v kódu, bude to pro tebe lepší. |
||
bicebs Profil |
#3 · Zasláno: 10. 6. 2014, 19:06:32
Ďakujem.
|
||
Davex Profil |
bicebs:
Asi bys měl na řádku 49 sestavit nějaký použitelný odkaz na potvrzující skript a ne na skript s formulářem. Teď je ten řádek rozbitý vinou této diskuse, takže příště piš do kódu za řetězec "http://" mezery okolo teček.
$path = "http://" . $_SERVER["SERVER_NAME"] . ":" . $_SERVER["SERVER_PORT"] . "/potvrzujici-skript.php" . "?clanok=registraciadokoncena&id=" . $lastid . "&email=" . $_POST["email"]; |
||
bicebs Profil |
#5 · Zasláno: 10. 6. 2014, 20:47:06
Už som to prepísal tak ako to mám v svojom skripte to predtým bola nejaká chyba.
|
||
Amunak Profil |
#6 · Zasláno: 10. 6. 2014, 21:38:58
A nepoužívej mysql_* funkce, jsou zastaralé. Zkus mysqli_query (a k tomu příbuzné funkce), využij nějaký databázový framework/knihovnu nebo můžeš použít PDO.
|
||
bicebs Profil |
Ja to robím podľa linuxsoftu http://www.linuxsoft.cz/article.php?id_article=538.
|
||
aDAm Profil |
#8 · Zasláno: 11. 6. 2014, 08:37:40
Je to sice pěkné že to děláš podle linuxsoftu, ve své podstatě je to ok, ale všimni si data vydání článku 24.11.2004 15:00 takže se učíš u pomalu 10 let starého tutorialu, takže za tu dobu se toho poměrně dost změnilo.
|
||
juriad Profil |
#9 · Zasláno: 11. 6. 2014, 08:55:15
bicebs:
Přestože je ten seriál kvalitní, své nejlepší dny má již za sebou; za nedlouho oslaví desáté narozeniny. Ten skript trpí mnoha chybami: 1) funkce ereg a mysql_ jsou deprecated 2) nijak se neřeší problém SQL Injection, ať už útok nebo obyčejná přezdívka obsahující apostrofy 3) zjišťovat počet záznamů v databázi pomocí mysql_num_rows je blbost; zbytečně se přenáší záznamy všech uživatelů, jen aby se spočítal jejich počet 4) konstrukce or die() je na produkci nesmyslná, je vhodná (a i tehdy je to na pováženou) při vývoji
5) funkce email a prezdivka v db neřeší atomicitu; co kdyby se v jednu milisekundu zaregistrovali dva shodně pojmenovaní uživatelé (PHP negarantuje, že skript doběhne dříve než se začne provádět druhý) 6) nejsou pořádně definované databázové constraints (souvisí s 5) 7) operátor | není or, takový jaký bys chtěl; chceš použít || 8) pojmenování souborů je mizerné 9) nepůjde ti poslat mail s diakritikou 10) nijak neřešíš přesměrování po registraci (stačí aby uživatel stisknul F5 a dostane se na registrační stránku s chybou, že je již registrován) Původní problém spočívá v chybě na řádku 49. Tam se totiž skládá ten odkaz; konkrétně se tam používá $_SERVER["SCRIPT_NAME"] , což vede na aktuální skript s registrací, nikoli s potvrzením. Řešení ti již řekl [#4] Davex.
|
||
bicebs Profil |
#10 · Zasláno: 11. 6. 2014, 10:56:52
Ak to už nie je aktuálne tak je tento tutorial dobrý? http://www.koding.cz/index.php?type=PHP
Poznáte nejaký aktuálny v češtine alebo slovenčine? |
||
bicebs Profil |
#11 · Zasláno: 11. 6. 2014, 15:16:16
Spravil som to tak ako to tam písali ale stále mi to nepotvrdí registráciu aj keď mi vypíše text "Vaše registrace byla dokončena.".
|
||
juriad Profil |
#12 · Zasláno: 11. 6. 2014, 15:22:50
Tak si zkus vypast jaký dotaz se ve skuečnosti provádí:
echo "update uzivatelia set registraciadokoncena=1 where id=".$_GET["id"]." and email='".$_GET["email"]."';"; |
||
bicebs Profil |
#13 · Zasláno: 11. 6. 2014, 16:30:32
juriad:
Keď som tam pridal tvoj príkaz tak mi napíše toto:update uzivatelia set registraciadokoncena=1 where id= and email='';Vaše registrace byla dokončena. |
||
juriad Profil |
Takže evidentně v skript nedistane parametry id a email. Zkontroluj, že odkaz v mailu tyto parametry obsahuje.
|
||
bicebs Profil |
#15 · Zasláno: 11. 6. 2014, 16:43:34
Sú tam.
|
||
Taps Profil |
bicebs:
V odkaze, který zasíláš na email nahraď entitu & za &. Po této upravě se mi již zobrazit sql dotaz korektně $path = "http://" . $_SERVER["SERVER_NAME"] . ":" . $_SERVER["SERVER_PORT"] . "/potvrzujici-skript.php" . "?clanok=registraciadokoncena&id=" . $lastid . "&email=" . $_POST["email"]; |
||
bicebs Profil |
#17 · Zasláno: 11. 6. 2014, 21:11:02
Taps:
Ešte som nič nezmenil a niekto sa mi tu zaregistroval ale má potvrdenú registráciu. Teraz keď som to zmenil ako si mi poradil tak to ide aj mne. Ďakujem. |
||
Taps Profil |
#18 · Zasláno: 11. 6. 2014, 21:20:04
bicebs:
Ta registrace je moje :-) Ručně jsem entity změnil v URL adrese |
||
bicebs Profil |
#19 · Zasláno: 11. 6. 2014, 21:26:06
Ja som sa zľakol či to nie je nejaký program, hacker alebo chyba skriptu. :)
|
||
Taps Profil |
#20 · Zasláno: 11. 6. 2014, 21:34:33
bicebs:
skript doporučuji ošetřit proti SQL injection |
||
Jan Tvrdík Profil |
#21 · Zasláno: 11. 6. 2014, 22:22:46
Taps:
Chybí ti tam urlencode. |
||
bicebs Profil |
#22 · Zasláno: 12. 6. 2014, 10:28:56 · Upravil/a: bicebs
Ja viem zatiaľ robím iba základy.
Posledná otázka : Mám pokračovať alebo začať s týmto tutorialom http://www.koding.cz/index.php?type=PHP ak nie tak aký iný? |
||
Časová prodleva: 10 let
|
0