Autor | Zpráva | ||
---|---|---|---|
papalas Profil * |
#1 · Zasláno: 16. 4. 2015, 16:54:25
Zdravím zkouším udělat na svém webu registraci ale narazil jsem na menší problém.
Skoro všechny funkce funguji až na jednu a to je ta která kontroluje jestli se už v databázi nenachází uživatel který používá vložené $name. U všech ostatních kontrol to zachití jestli nejsou vyplněna všechna pole nebo jestli se už pužívá zadaný $login ale když zadám $name které je již užívané tak to kontrola ignoruje a rovnou se všechny udaje zapíší do databáze a vypíše se hláška (poděkování za registraci) používám tento skript: <?php if(isset($_POST['go'])){ if(isset($_POST['name'])) { $name = stripslashes(htmlspecialchars(trim($_POST['name']))); if($name == '') { unset($name); } } if(isset($_POST['login'])) { $login = stripslashes(htmlspecialchars(trim($_POST['login']))); if($login == '') { unset($login); } } if(isset($_POST['heslo'])) { $heslo = stripslashes(htmlspecialchars(trim($_POST['heslo']))); if($heslo == '') { unset($heslo); } } if(empty($name) or empty($login) or empty($heslo)) { header("Location: /registration.php?error=1"); header("Connection: close"); }else{ require_once '/tools/db.php'; $q1 = mysql_query("SELECT * FROM `users` WHERE `login`='".$login."'"); $q2 = mysql_query("SELECT * FROM `users` WHERE `name`='".$name."'"); if(!$q1 or !$q2) { echo mysql_error() . ' - ' . mysql_errno(); } else { if(mysql_num_rows($q1)==1){ header("Location: /registration.php?error=2"); header("Connection: close"); } elseif(mysql_num_rows($q2)==1){ header("Location: /registration.php?error=3"); header("Connection: close"); } else { $q3 = mysql_query("INSERT INTO `users`(`name`,`login`,`pass`) VALUES('".$name."','".$login."','".$heslo."')"); if(!$q3) { echo mysql_error() . ' - ' . mysql_errno(); } else { echo 'Děkuji za registraci, teď se můžete <a href="index.php">přihlásit</a>.'; } } } } } else { header("Location: ".$_SERVER['SERVER_ROOT']."registration.php"); } ?> |
||
Fisir Profil |
#2 · Zasláno: 16. 4. 2015, 17:30:33
Reaguji na papalase:
Zaprvé, k escapování se používá funkce mysql_real_escape_string() . Pokud si jako heslo zadám 3<2>7 , budu se nakonec muset přihlašovat s heslem 3&lq;2&rq;7 . Zadruhé, heslo bys neměl ukládat v plaintextu, ale zahashované. A do třetice všeho, mysql_* funkce jsou zastaralé a budou odstraněny.
Jsi si jistý, že v databázi nemáš více záznamů se stejným jménem? Protože jestli ano, podmínkou == 1 to projde. Potom taky můžeš zkusit nahradit header("Connection: close") za exit() , ale nevím, jestli to bude mít nějaký efekt.
|
||
smiesek Profil |
#3 · Zasláno: 17. 4. 2015, 03:11:22
papalas:
já bych kontrolu ověření shodu záznamu v DB dělala za pomocí výběru id záznamu z tabulky, než vybíráním všeho z něčeho, tedy místo: $q1 = mysql_query("SELECT * FROM `users` WHERE `login`='".$login."'"); $q2 = mysql_query("SELECT * FROM `users` WHERE `name`='".$name."'") bych použila formulaci typu: $q = "SELECT id FROM users WHERE login = '".$login."' AND name = '".$name."'"; |
||
Joker Profil |
#4 · Zasláno: 17. 4. 2015, 07:55:25
papalas:
Co je v $name? Čekal bych jméno, ale pak nechápu, proč má být unikátní. Údaje z formuláře se prohánění řadou funkcí, přičemž ani jedna nedává v daném kontextu smysl. Viz [#2] Fisir. A i přes ošetření třemi funkcemi když zadám jméno „a”, login „b” a heslo „c'), ('a','b', 'c”, založí to dvakrát uživatele se údaji a, b, c. A pak už mi to dovolí založit libovolné množství dalších uživatelů se stejným jménem, protože podmínka porovnává počet řádků proti jedničce a pro dva, tři, … to projde. Další co nechápu je, proč se tam unset-ují prázdné proměnné, když se pak kontrolují funkcí empty, která prázdný řetězec a nedefinovanou proměnnou bere stejně. Mimochodem vzhledem k funkci empty není možné mít jako jméno, login ani heslo nulu (0). A samozřejmě do databáze se nemá ukládat přímo heslo zadané uživatelem. „Potom taky můžeš zkusit nahradit header("Connection: close") za exit() , ale nevím, jestli to bude mít nějaký efekt.“
To by tam být mělo a ještě předtím by měl být HTML kód s odkazem pro ty, které to náhodou nepřesměruje. |
||
Časová prodleva: 10 let
|
0