Diskuze: Včera registrace, dnes přihlášení :(

PHP PHP Včera registrace, dnes přihlášení :( American English version English version

Avatar
smoukey
Člen
Avatar
smoukey:

Zdravím,

včera jsem zde úspěšně vyřešil registraci. No a nakopli mně v tom tématu, abych použil už jiné hashování hesel.

Nyní hesla hashuji takto:

$heslo=hash_hmac("SHA512", "$heslo1", "$nick");

Mám to tak i v registraci:

$heslo=hash_hmac("SHA512", "$heslo1", "$login");

No a problém je v tom, že mě to nepřihlásí.

Mám dva skripty na přihlašování.

Jeden je starší, ale na ten mi fungovalo přihlašování, když jsem používat md5().

<?php
require_once("funkce.php");
nacti_db();
vyber_db();

header("Content-Type: text/html; charset=utf-8");
$login = mysql_real_escape_string($_POST["nick"]);
$heslo = mysql_real_escape_string($_POST["heslo"]);
$md5heslo = md5($heslo);
$dotaz = mysql_query("select * from users where username = '$login' and pw = '$md5heslo'");
$overeni = mysql_num_rows($dotaz);
$row = mysql_fetch_array($dotaz);
if($overeni == 1) {
        $dotaz2=mysql_query("select * from users where aktivovan=1 AND username= '$login' AND pw = '$md5heslo'");
        $aktivovan=mysql_fetch_array($dotaz2);
        if ($aktivovan['aktivovan']==1){
                session_start();
    $_SESSION['login'] = stripslashes($login);
    $_SESSION['id'] = $row["id"];
    echo("<script language='JavaScript'>
                                        <!--
                                        window.alert('Byl jste úspěšně přihlášen');
                                        history.back();
                                        // -->
                                        </Script>");
    die();
    session_save_path();
        }
        else {
                echo '<script>alert("Váš účet ještě nebyl aktivován"); history.back();</script>';
        }

} else {
    echo("<script language='JavaScript'' charset='utf-8'>
        <!--
        window.alert('Zadali jste neplatné uživatelské jméno nebo heslo!');
        history.back();
        // -->
        </Script>");
}
?>

A takto vypadá skript po úpravě.

<?php
require_once("funkce.php");
nacti_db();
vyber_db();
header("Content-Type: text/html; charset=utf-8");


$chyby=array();

if(empty($_POST["nick"])){
        $chyby[]="Nevyplnili jste uživatelské jméno";
}
if(empty($_POST["heslo"])){
        $chyby[]="Nezadali jste heslo";
}
if(mysql_error()){
        $chyby[]=mysql_error();
}

if(!$chyby){
        $login = mysql_real_escape_string($_POST["nick"]);
        $heslo1 = mysql_real_escape_string($_POST["heslo"]);
        $heslo=hash_hmac("SHA512", "$heslo1", "$login");
        $dotaz = mysql_query("select * from users where username = '$login' and pw = '$heslo'");
        $overeni = mysql_num_rows($dotaz);
        $row = mysql_fetch_array($dotaz);
        echo "1 OK";
        if ($overeni==1){
                $dotaz2=mysql_query("select * from users where aktivovan=1 AND username= '$login' AND pw = '$heslo'");
                $aktivovan=mysql_fetch_array($dotaz2);
                echo "2 OK";
                if ($aktivovan['aktivovan']==1){
                        echo "3 OK";
                        session_start();
                        $_SESSION['login']=stripslashes($login);
                        $_SESSION['id']=$row["id"];
                        echo '<script>alert("Byl jste úspěšně přihlášen.");history.back();</script>';
                        die();
                        session_save_path();
                }
                else $chyby[]="Váš účet zatím nebyl aktivován, proto se nemůžete přihlásit!";
        }
        else {
                $dotaz2 = mysql_query("select * from users where username = '$login' or pw = '$heslo'");
                $overeni2 = mysql_fetch_array($dotaz2);
                if ($overeni2["username"]!==$login){
                        $chyby[]="Zadali jste neplatné uživatelské jméno";
                }
                if ($overeni2["pw"]!==$heslo){
                        $chyby[]="Zadali jste neplatné heslo";
                }
        }

}
else{
        echo '<script>alert("V registrace nebylo možné pokračovat z níže uvedených důvodů: \n';

                        foreach ($chyby as $chyba) {
                        echo '-'.$chyba.'\n';
                        }

                echo '");history.back();</script>';
}




?>

Pozn.: echo "1 OK"; atd.. Tam mám pro to, abych věděl kde je chyba, přes co se mi ten script nedostane.

V novém skriptu se mi to nedostalo za echo "1 OK".

Ve starém skriptu mi to napsal, že mám neplatné uživ. jméno nebo heslo.

Co tam je špatně? :(

 
Odpovědět 10.7.2014 12:02
Avatar
Odpovídá na smoukey
Martin Konečný (pavelco1998):

Ahoj,

nemáš v databázi uložené ještě staré hashe?

 
Nahoru Odpovědět 10.7.2014 12:46
Avatar
smoukey
Člen
Avatar
smoukey:

Ne ne, celou tabulku s uživateli jsem vyprázdnil.

 
Nahoru Odpovědět 10.7.2014 12:47
Avatar
smoukey
Člen
Avatar
smoukey:

Jasně, jsem v*l. Ale správně jsi mne navedl, koukal jsem furt na kód, ale tne je správně, chyba byla na straně db. Měl jsem u pw datový typ varchar a délka 32, jenže to je málo, tak jsem zvětšil délku a vše šlape. Děkuji. :)

 
Nahoru Odpovědět  +1 10.7.2014 12:49
Avatar
Odpovídá na smoukey
Martin Konečný (pavelco1998):

Jen takový detail. Druhý DB dotaz, kde máš WHERE aktivovan = 1, je zbytečný. Na data pro daného uživatele ses dotazoval jíž předtím, tak ti stačí jen udělat fetch a zkontrolovat, jestli ta hodnota se rovná 1.

<?php

$login = mysql_real_escape_string($_POST["nick"]);
$heslo1 = mysql_real_escape_string($_POST["heslo"]);
$heslo=hash_hmac("SHA512", "$heslo1", "$login");
$dotaz = mysql_query("select * from users where username = '$login' and pw = '$heslo'");
$overeni = mysql_num_rows($dotaz);
$row = mysql_fetch_array($dotaz);

if ($overeni == 1) {
  if ($row["aktivovan"] == 1) {
     // ...
  }
}

Jinak je obecně lepší nepoužívat mysql_fetch_a­rray(), ale mysql_fetch_as­soc(), které ti vytvoří pouze asociativní pole.
Pokud hledáš jen hodnotu jednoho sloupce, můžeš použít:

$dotaz = mysql_query("SELECT sloupec FROM tabulka WHERE podmínka");
$hodnotaSloupce = mysql_result($dotaz, 0);
 
Nahoru Odpovědět 10.7.2014 13:21
Avatar
smoukey
Člen
Avatar
smoukey:

Děkuji za připomínku. U toho mysql_result($do­taz, 0). Co znamená ten druhý parametr? První je jasný, druhý nevím.

 
Nahoru Odpovědět 10.7.2014 13:51
Avatar
Odpovídá na smoukey
Martin Konečný (pavelco1998):

http://php.net/…l-result.php

Btw, když odpovídáš, je lepší stisknout na "Odpovědět", zobrazí se mi to pak v událostech a nemusím se dívat, jestli někdo nepřidal příspěvek.

 
Nahoru Odpovědět 10.7.2014 13:59
Avatar
smoukey
Člen
Avatar
Odpovídá na Martin Konečný (pavelco1998)
smoukey:

Jestli to teda ještě dobře chápu, tak použiji mysql_result takto:

$dotaz=mysql_query("SELECT * FROM users WHERE email='$email' AND username='$nick'");
$overeni=mysql_result($dotaz, 0)

Když mi to hodí false, spíše 0, tak ten záznam v DB není, pokud to hodí 1, tka tam záznam je. Chápu to dobře?

 
Nahoru Odpovědět 10.7.2014 15:02
Avatar
Odpovídá na smoukey
Martin Konečný (pavelco1998):

Podle dokumentace to vrátí při úspěchu výsledek (hodnotu sloupce), jinak FALSE. Nejsem si jistý, ale podle mě to FALSE vyhodí v případě, že se nesplní podmínka a nenajde se žádná hodnota (alespoň v PDO to tak funguje).

 
Nahoru Odpovědět 10.7.2014 15:04
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 10 zpráv z 10.