Autor | Zpráva | ||
---|---|---|---|
SkyVessel Profil |
Zdravím. Snažil jsem se vytvořit si trvalé přihlášení, ale nemůžu to rozchodit... Login atd jede, ale ten první script na trvalé přihlášení se zasekne na řádku 12 - v proměnné user nic není, to znamená, že samotné přihlášení neproběhne... Přehlídnul jsem někde nějakou chybu?
A druhá věc: nemám tam nějak citlivá data, ale kdybych ten skript používal i jinde - je tento kód "bezpečný"? Nebo bych to měl nějak upravit? Díky za pomoc <?php # login.php session_start(); $zprava = false; // automatické přihlášení if (isset($_COOKIE['trvaly_login'])) { //jestli existuje cookie require_once ('mysql_spojit.php'); // Připojit se k dbs. list($id, $token) = explode(":", $_COOKIE['trvaly_login']); //Načte hodnoty z cookie $dotaz = "SELECT id, nick, member, token FROM users WHERE id='$id' AND token='$token'"; $vysledek = mysql_query ($dotaz); $user = mysql_fetch_array ($vysledek, MYSQL_NUM); if ($user) { $_SESSION['id'] = $user[0]; $_SESSION['nick'] = $user[1]; $_SESSION['member'] = $user[2]; $_SESSION['token'] = $user[3]; $zprava = $zprava.'Proběhlo automatické přihlášení. Gratuluji =D<br>'; } //mysql_close(); } if (isset($_POST['login'])) { // Přihlášení -------------------------------- require_once ('mysql_spojit.php'); // Připojit se k databázi. if (empty($_POST['nick'])) { // Ověřit uživatelské jméno. $nick = FALSE; $zprava = $zprava.'Nebyl zadán Nick!<br />'; } else { $nick = trim($_POST['nick']); } if (empty($_POST['pass'])) { // Ověřit heslo. $pass = FALSE; $zprava = $zprava.'Nebylo zadáno heslo!<br />'; } else { $pass = trim($_POST['pass']); } if ($nick && $pass) { // Je-li vše OK $dotaz = "SELECT id, nick, member FROM users WHERE nick='$nick' AND password=sha1('blablabla$pass')"; //$dotaz = "SELECT nick, member FROM users WHERE nick='$nick' AND password=PASSWORD('$pass')"; $vysledek = @mysql_query ($dotaz); $user = mysql_fetch_array ($vysledek, MYSQL_NUM); if ($user) { // Nalezen záznam. // Zahajte uživatelskou relaci, registrujte hodnotu a přesměrujte výstup. $_SESSION['id'] = $user[0]; $_SESSION['nick'] = $user[1]; $_SESSION['member'] = $user[2]; if (isset($_POST['autologin'])) { //pokud je zaškrtnut autologin $token = md5(uniqid(mt_rand(), true)); //nastavení cookie pro autologin setcookie('trvaly_login', '$_SESSION["id"]:$token', strtotime("+5 month")); $dotaz = "UPDATE users SET token = '$token' WHERE id = $user[0]"; $vysledek = @mysql_query($dotaz); } $zprava = $zprava.'Proběhl login.<br>'; } else { // Záznam nebyl nalezen. $zprava = $zprava.'Špatně zadaný nick nebo heslo.<br />'; } mysql_close(); // Zavřít připojení k databázi. } else { // Pokud došlo k chybě. $zprava = $zprava.'<p>Zkuste to znovu.</p>'; } } // Konec zpracování formuláře. ... |
||
greeny Profil |
#2 · Zasláno: 29. 5. 2012, 08:34:22
/*řádek 7*/ if (isset($_COOKIE['trvaly_login_rsf'])) /*řádek 59*/ setcookie('trvaly_login', '$_SESSION["id"]:$token', strtotime("+5 month")); Pokud nepomůže, tak... 1) mrkni se do databáze, jestli máš správně vyplněná data, token a porovnej s cookies 2) u všech query dej MySQL_Query($dotaz) or die(MySQL_Error()); (zjistí zda nemáš chybu v sql)
3) pokud všechno selže, tak řádek po řádku vypisuj pomocí var_dump() všechny proměnné co používáš
|
||
candiess Profil |
SkyVessel:
Testuješ cookie s tímto názvem „if (isset($_COOKIE['trvaly_login_rsf'])) {“ A při pamatování posíláš cookie s tímto názvem: „setcookie('trvaly_login', '$_SESSION["id"]:$token', strtotime("+5 month"));“ Kde udělal tesař díru? :) |
||
SkyVessel Profil |
#4 · Zasláno: 29. 5. 2012, 08:44:02
tesař udělal chybu při přepisu... Ve zdroji je to správně... V dbs jsou data vyplněna správně. Poraďte, kde najdu cookies ve win 7 pro firefox?!? Snažil jsem se je najít, ale bez úspěchu... Jo jink v dbs mám token nastavený jako varchar(32) - stačí to pro md5, žejo...
Budu zkoušet body dva a tři a pak se ozvu... |
||
greeny Profil |
#5 · Zasláno: 29. 5. 2012, 08:48:22
Firefox -> Možnosti -> Možnosti -> Soukromí -> Odebrat některá cookies -> Bingo ;)
varchar(32) stačí.. ale myslím, že by stačilo dát ten cookie název stejně ;) |
||
SkyVessel Profil |
#6 · Zasláno: 29. 5. 2012, 09:13:12
jaj... ono to je jen pro odebrání, ale jde vidět i jejich obsah omg... Ale vypisováním jednotlivých proměnných jsem právě zjistil, že v cookies je kravina - je tam uložené $_SESSION[\"id\"]:$token...?? Tzn na řádku 59 je to špatně napsané... Jak to napsat, aby se tam nenačetly ty řetězce, ale proměnné?!
setcookie('trvaly_login', '$_SESSION["id"]:$token', strtotime("+5 month")); |
||
peta Profil |
#7 · Zasláno: 29. 5. 2012, 10:04:50
SkyVessel:
'$_SESSION["id"]:$token' $_SESSION["id"].':'.$token "{$_SESSION["id"]}:$token" |
||
SkyVessel Profil |
#8 · Zasláno: 29. 5. 2012, 12:17:02
peta:
„to je textovy retezec. Nic vic, nic min.“ Jasně že jo... Díky... Člověk je ve stresu, tak už ani neuvažuje racionálně... Teď už to i funguje :) ...jsem už dlouho s php nic nedělal, tak člověk pak nadělá takové chyby... Jsem ten kod chtěl někde zkopčit, ale nic jsem nenašel, tak jsem si ho musel napsat =D Ještě jednou díky za zastavení a help. Palec nahoru všem... |
||
Časová prodleva: 12 let
|
0