| 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: 11 let
|
|||
0