Autor Zpráva
B1abla
Profil
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&nbsp;DB Error!&nbsp;Try&nbsp;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&nbsp;in&nbsp;secure&nbsp;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&nbsp;Error!&nbsp;Try&nbsp;Again');
    }
}
else
{
    include('close_dbconn.php');
    Header('Location: index.php?message=Fatal&nbsp;login&nbsp;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
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

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: