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
/*řádek 7*/ if (isset($_COOKIE['trvaly_login_rsf']))
/*řádek 59*/ setcookie('trvaly_login', '$_SESSION["id"]:$token', strtotime("+5 month"));
Možná ti dělá problémy jiný název proměnné...

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
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
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
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
SkyVessel:
'$_SESSION["id"]:$token'
to je textovy retezec. Nic vic, nic min. Zadnou promennou to automaticky neprepisuje.

$_SESSION["id"].':'.$token
to jsou promenne spojene textovym retezcem

"{$_SESSION["id"]}:$token"
toto by mohlo tez fungovat, ale doporucuji predchozi reseni
SkyVessel
Profil
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...

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: