21. září bude sraz! Od 18.00 v restauraci Tradice v Praze u Anděla
Autor Zpráva
Spectrum
Profil *
Už mám fungujúci kód na registráciu, no neviem si poradiť s prihlásenim. Mám zatiaľ kód:

<form method="POST">
                    Nick:<br><input type="text" maxlength="15" name="meno"><br><br>
                    Heslo:<br><input type="password" name="pass"><br><br>
              <input type="submit">
               </form>
<?php

$nick = mysql_real_escape_string($_POST["meno"]);
$pass = mysql_real_escape_string($_POST["pass"]); 
$sha1pass = sha1($pass);
?>

No vôbec netuším ako skontrolujem či sa zadané hodnoty rovnajú s dátami v tabuľke 'uzivatelia'. Vedel by mi niekto prosím poradiť?
Alphard_
Profil *
Viz https://gist.github.com/JanTvrdik/8d813cfc7a4a8e0db2c7. Ocením zpětnou odezvu, jestli se vám ten kód zdá srozumitelný, nebo čemu případně nerozumíte.
Spectrum
Profil *
Vďaka za radu, upravil som to nejak takto:

<?php
// global variables
$connection = mysqli_connect('localhost', '***', '***', 'matko');
$pathIndex = 'http://' . $_SERVER['SERVER_NAME'] . $_SERVER['PHP_SELF'];
session_start();
/**
* Attemps to log-in the user.
*
* @param string $username
* @param string $password (in plain text)
* @return bool TRUE for success, FALSE otherwise
*/
function userLogin($username, $password)
{
global $connection;
$result = mysqli_query($connection, '
SELECT *
FROM `uzivatelia`
WHERE `meno` = ' . mysqli_real_escape_string($connection, $username)
);
$row = mysqli_fetch_assoc($result);
if ($row === NULL) {
return FALSE; // incorrect username
}
if (!password_verify($password, $row['password'])) {
return FALSE; // incorrect password
}
session_regenerate_id(TRUE); // prevents session fixation
unset($row['password']);
$_SESSION['user'] = $row;
return TRUE;
}
/**
* Logouts the user.
*
* @return void
*/
function userLogout()
{
unset($_SESSION['user']);
}
/**
* Handles log-in request.
*
* @return void
*/
function actionLogin()
{
global $pathIndex;
$ok = userLogin($_POST['username'], $_POST['password']);
$url = $pathIndex . ($ok ? '' : '?incorrect_login=1');
header("Location: $url", TRUE, 303);
exit;
}
/**
* Handles log-out request.
*
* @return void
*/
function actionLogout()
{
global $pathIndex;
userLogout();
header("Location: $pathIndex", TRUE, 303);
exit;
}
if (isset($_POST['username'], $_POST['password'])) {
actionLogin($pathIndex);
} elseif (isset($_GET['logout'])) {
actionLogout($pathIndex);
}
?> 



<?php if (isset($_SESSION['user'])): ?>
<p>
Prihlásený ako: <?=htmlspecialchars($_SESSION['user']['name']) ?> (id <?=$_SESSION['user']['id'] ?>)
<a href="<?=htmlspecialchars("$pathIndex?logout=1") ?>">Odhlásiť</a>
</p>
 
<?php else: ?>
<div>
<?php if (isset($_GET['incorrect_login'])): ?>
<p style="color: #F00">Zadali jste neplatné uživatelské meno alebo heslo</p>
<?php endif; ?>
<form action="index.php" method="post">
Meno: <br><input name="username" type="text"><br><br>
Heslo: <br><input name="password" type="password"><br><br>
<input name="submit" type="submit" value="Prihlásiť">
</form>
</div>
<?php endif; ?> 

No vždy to napíše som napísal neplatné heslo/meno hoci v databázi normálne je.
Jan Tvrdík
Profil
Alphard je moc akční a odkazuje na kód, co nikdo nikdy nezkusil a není určen pro cílové uživatele. V důsledku toho ten kód obsahoval několik chyb, z nichž ta podstatná je na řádku, kde máš
WHERE `meno` = ' . mysqli_real_escape_string($connection, $username)
správně by tam mělo být
WHERE `meno` = "' . mysqli_real_escape_string($connection, $username) . '"'

Kromě toho heslo v databázi musí být hashované funkcí password_hash.
Slark
Profil *
také si musíte upravit váš registrační formulář a hesla ukládat pomocí funkce password_hash. Ve vašem prvním příkladu to vypadá, že jste ukládal hesla pomocí hashovací funkce sha1 ale řešení co Vám zaslal Alphard_ počítá s heslem zahashovaným fcí password_hash.
Spectrum
Profil *
Takže upravil som kód, keď zadám zlé údaje tak všetko ide tak ako má, no ak zadám správne údaje, všetko čo sa stane je že zmizne všetko čo je za php kódom a stránka je neukončená (nenachádzajú sa tam tagy </body>, </html>...)
Alphard_
Profil *
Spectrum:
Jak nyní vypadá kód a jakou máte verzi PHP?
Pokud máte stále v databázi hashe sha1 a nechcete to měnit, lze
if (!password_verify($password, $row['password'])) {
upravit na
if (sha1($password) !== $row['password']) {
(ovšem za cenu menší ochrany hesel).
Spectrum
Profil *
Môj kód vypadá teraz nasledovne, no stále mám ten istý problém, ak zadám správne údaje, všetko čo sa stane je že zmizne všetko čo je za php kódom a stránka je neukončená (nenachádzajú sa tam tagy </body>, </html>...)

<?php
// global variables
$connection = mysqli_connect('localhost', '***', '***', 'matko');
$pathIndex = 'http://' . $_SERVER['SERVER_NAME'] . $_SERVER['PHP_SELF'];
session_start();
/**
* Attemps to log-in the user.
*
* @param string $username
* @param string $password (in plain text)
* @return bool TRUE for success, FALSE otherwise
*/
function userLogin($username, $password)
{
global $connection;
$result = mysqli_query($connection, '
SELECT *
FROM `uzivatelia`
WHERE `meno` = "' . mysqli_real_escape_string($connection, $username) . '"'
);
$row = mysqli_fetch_assoc($result);
if ($row === NULL) {
return FALSE; // incorrect username
}
if (!password_verify(sha1($password) !== $row['password'])) {
return FALSE; // incorrect password
}
session_regenerate_id(TRUE); // prevents session fixation
unset($row['password']);
$_SESSION['user'] = $row;
return TRUE;
}
/**
* Logouts the user.
*
* @return void
*/
function userLogout()
{
unset($_SESSION['user']);
}
/**
* Handles log-in request.
*
* @return void
*/
function actionLogin()
{
global $pathIndex;
$ok = userLogin($_POST['username'], $_POST['password']);
$url = $pathIndex . ($ok ? '' : '?incorrect_login=1');
header("Location: $url", TRUE, 303);
exit;
}
/**
* Handles log-out request.
*
* @return void
*/
function actionLogout()
{
global $pathIndex;
userLogout();
header("Location: $pathIndex", TRUE, 303);
exit;
}
if (isset($_POST['username'], $_POST['password'])) {
actionLogin($pathIndex);
} elseif (isset($_GET['logout'])) {
actionLogout($pathIndex);
}
?> 

<div>

<?php if (isset($_SESSION['user'])): ?>
<p>
Prihlásený ako: <?=htmlspecialchars($_SESSION['user']['name']) ?> (id <?=$_SESSION['user']['id'] ?>)
<a href="<?=htmlspecialchars("$pathIndex?logout=1") ?>">Odhlásiť</a>
</p>
 
<?php else: ?>

<form action="index.php" method="post">
Meno: <br><input name="username" type="text"><br><br>
Heslo: <br><input name="password" type="password"><br><br>
<input name="submit" type="submit" value="Prihlásiť">
</form>
<?php if (isset($_GET['incorrect_login'])): ?>
<p style="color: #F00">Zadali jste neplatné uživatelské meno alebo heslo</p>
<?php endif; ?>
</div>
<?php endif; ?> 
Alphard_
Profil *
Lepší by bylo vypsat si chyby, ale předpokládám, že nemáte dostupnou funkci password_verify() a PHP končí fatal errorem.

Použijte moji radu [#7], funkci verify_password() dejte úplně pryč.
if (sha1($password) !== $row['password']) {
        return FALSE; // incorrect password
    }

Pak to funguje, jen je třeba mít kód v souladu s databází, session pole přistupuje ke klíčům username a password, které se musí shodovat se sloupci v databázi. Buď přejmenujte sloupce, nebo všechny proměnné.
Spectrum
Profil *
Alphard:
Funguje to :)

Veľká vďaka každému kto mi pomohol, cením si to.

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:

0