Autor | Zpráva | ||
---|---|---|---|
B1abla Profil |
#1 · Zasláno: 9. 9. 2012, 23:22:34
Ahoj, mám problém s tím to kódem, nejsem schopen odhalit kde mám chybu. Potřeboval jsem registraci a případné přihlášení ke stránkám, jelikož jsem v PHP ametér a nejsem schopen si vlastní přihlašovací script napsat sám, stáhnul jsem jednu volně šířitelnou "knihovnu" z internetu. Vše funguje jak má pokud vytvořím tabulku stejnou jako je v dokumentaci ke "knihovně" ale problém nastává v případě kdy si vytvořím vlastní tabulku ze svým názvem a sloupci (jak počtem tak názvy).
Tento script má ověřit jaké údaje uživatel zadal do přihlašovacího formuláře (jsou to pole "nick" = uživatelské jméno a "pass" = heslo), dále ověřit zda se shodují zadané hodnoty s těmi v tabulce a zápis do $_SESSION, potom přesměrovat na script index.php, který mimo jiné zobrazí skrytý obsah. Můj problém je v tom že mi script hlásí Wron login, nevím proč a už jsem vyčerpal své možnosti, proto se zde chci zeptat čím to může být, popřípadě komentář ke scriptu, jestli není zastaralý, zbytečně složitý atd. Budu vděčný za jakoukoli radu mám vyzkoušené: - připojení k DB a tabulce "uzivatele" - výpis hodnot s tabulky, že tam opravdu jsou, názvy sloupců v tabulce, názvy formulářových hodnot (input name) <?php //Definice dotazu Define('SQLgetUserByLogin', 'SELECT id, nick, pass FROM uzivatele WHERE nick = "__nick__" AND pass = "__pass__"'); if (isset($_POST['nick']) && isset($_POST['pass'])) //Kontrola, zda jsou nastaveny všechny požadované promené { $nick = $_POST['login']; $pass = $_POST['password']; $ip = $_SERVER['REMOTE_ADDR']; require('DB_connect.php'); //pripojení k databázi //Složení dotazu, __login__ a __password__ se nahradí //hodnotamy promených $login a zahashevaným $password //Takovéto skládání usnadnuje správu dotazu ve vetších //aplikacích a jejich opetovné používání na více místech $query = SQLgetUserByLogin; $query = str_replace( "__nick__" , $nick , $query ); $query = str_replace( "__pass__" , sha1($pass) , $query ); $login_result = MySQL_query($query, $DBLink); //provedení dotazu if (MySQL_errno($DBLink) != 0){//kontrola provedení dotazu a odchyt chyb //Tady by melo být zalogování chyby //Header('Location: index.php?message=Fatal DB Error! Try Again'); Echo $query.'<br />'; Echo MySQL_errno().' '. MySQL_error(); //Presmerování na index a hláška pro uživatele } if (MySQL_num_rows($login_result) == 1) //kontrola jestli byl nalezen odpovídající záznam { $user = MySQL_fetch_object($login_result); //nactení jednoho rádku vráceného záznamu, //nepocítá se s možností, že by jich bylo více, //sloupec login je v databázi unikátní session_start(); /*session_register("id"); session_register("login"); session_register("last_ip"); session_register("last_time");*/ //vytvorení session a registrace promených do session $_SESSION["id"] = $user->id; $_SESSION["nick"] = $user->nick; $_SESSION["last_ip"] = $ip; $_SESSION["last_time"] = time(); //zapsání uživatelských dat do session include('close_dbconn.php'); Header('Location: index.php?message=Welcome in secure zone!'); //presmerování na index a uvítání uživatele } elseif(MySQL_num_rows($login_result) == 0) { //Nebyl nalezen odpovídající záznam -> špatný login include('close_dbconn.php'); Header('Location: index.php?message=WrongLogin'); //Presmerování na znovuprihlášení se zprávou WrongLogin } else { //Pocet nalezených záznamù není 1 ani 0 tudíž je nekde error //Tady by melo být zalogování chyby include('close_dbconn.php'); Header('Location: index.php?message=Fatal Error! Try Again'); } } else { include('close_dbconn.php'); Header('Location: index.php?message=Fatal login error'); //Vyhozeni + message pokut je správne napsán formulár //a nikdo se nepokouší udelat neco pres POST request //tak by tato možnost nemela nastat, tudíž by výskyt //této události mel být opet logován } ?> |
||
panther Profil |
B1abla:
„popřípadě komentář ke scriptu, jestli není zastaralý, zbytečně složitý atd.“ složitý? Zbytečný, hloupý. Mylsím, že je zbytečné se k němu vyjadřovat. Stačí prvních pár řádek - SQL dotaz jako konstanta, pak dvojí nahrazení a dosazení hodnot... to je poprvé, co něco takového vidím). - nešetřené vstupy od uživatele do DB a dál jsem neměl odvahu koukat. Je sice pozdě, ale doufám, že tam nebude moc chyb (netestováno): <?php session_start(); if (isset($_POST['nick'])) { require('DB_connect.php'); // heslo by melo byt hashovane, tedy sha1 nebo jine hash funkce if ($_SESSION['id'] = mysql_result(mysql_query ("SELECT id FROM uzivatele WHERE nick = '" . mysql_real_escape_string($_POST['nick']) . "' AND pass = '" . sha1($_POST['pass']) . "' LIMIT 1"), 0)) { $_SESSION['nick'] = $_POST['nick']; $_SESSION['last_ip'] = $_SERVER['REMOTE_ADDR']; $_SESSION['last_time'] = time(); $message = 'Welcome_in_secure_zone!'; } else { $message = 'WrongLogin'; } // v header absolutni URL header('Location: http://example.com/index.php?message=' . $message); exit; } ?> |
||
B1abla Profil |
#3 · Zasláno: 10. 9. 2012, 17:57:07
to panther: Ahoj, moc děkuji. Dostal jsem se k počítači až tet, vše funguje a je to mnohem kratší a přehlednější.
Ještě jednou děkuji, vyřešeno |
||
Časová prodleva: 12 let
|
0