Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

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

Aktivity
Avatar
smoukey
Člen
Avatar
smoukey:10.7.2014 12:02

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):10.7.2014 12:46

Ahoj,

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

Nahoru Odpovědět
10.7.2014 12:46
Aktuálně připravuji browser RPG, FB stránka - https://www.facebook.com/AlteiraCZ
Avatar
smoukey
Člen
Avatar
smoukey:10.7.2014 12:47

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

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

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
10.7.2014 12:49
Avatar
Odpovídá na smoukey
Martin Konečný (pavelco1998):10.7.2014 13:21

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
Aktuálně připravuji browser RPG, FB stránka - https://www.facebook.com/AlteiraCZ
Avatar
smoukey
Člen
Avatar
smoukey:10.7.2014 13:51

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):10.7.2014 13:59

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
Aktuálně připravuji browser RPG, FB stránka - https://www.facebook.com/AlteiraCZ
Avatar
smoukey
Člen
Avatar
 
Nahoru Odpovědět
10.7.2014 14:05
Avatar
smoukey
Člen
Avatar
Odpovídá na Martin Konečný (pavelco1998)
smoukey:10.7.2014 15:02

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):10.7.2014 15:04

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
Aktuálně připravuji browser RPG, FB stránka - https://www.facebook.com/AlteiraCZ
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.