| Autor | Zpráva | ||
|---|---|---|---|
| Nuimi Profil |
#1 · Zasláno: 26. 9. 2016, 18:49:44
DObrý den,
vytvářel jsem nový login a narazil jsem na chybu. KDyž se přihlašuji, tak mi to vypisuje hlášky když udělám chybu. Jenže pokud vypíši špatně jméno, nestane se nic a pokud napíšu heslo špatně nápíše se že uživatel neexistuje. Neměl by jste někdo radu. Zde je zdroják. <?php
$jmeno_u = $_POST["jmeno_u"];
$heslo = $_POST["heslo"];
$heslo_h = hash_hmac("SHA512", $heslo, $jmeno_u);
if(isset($jmeno_u) && isset($heslo))
{
$dotaz_prava = $db->query("SELECT jmeno_u, prava FROM login WHERE jmeno_u='".$jmeno_u."'");
$dotaz_pravost = $db->query("SELECT jmeno_u,heslo FROM login WHERE jmeno_u='".$jmeno_u."' AND heslo='".$heslo_h."'");
$dotaz_heslo= $db->query("SELECT jmeno_u,heslo FROM login WHERE jmeno_u='".$jmeno_u."' OR heslo='".$heslo_h."'");
$dotaz_jmeno= $db->query("SELECT jmeno_u FROM login");
while($row_prava = $dotaz_prava -> fetch_assoc())
{
while($row_heslo = $dotaz_heslo -> fetch_assoc())
{
while($row_jmeno = $dotaz_jmeno -> fetch_assoc())
{
if($jmeno_u !== $row_jmeno['jmeno_u'])
{
echo('<div class="alert">
<span class="closebtn">×</span>
Chyba, Toto uživatelské jméno neexistuje.
</div>');
}
else
{
if( $row_prava['prava'] == "Ne")
{
echo('<div class="alert">
<span class="closebtn">×</span>
Byl vám odepřen přístup.
</div>');
}
else
{
if($dotaz_pravost->num_rows > 0)
{
$_SESSION['username']=$jmeno_u;
$den=Date("d");
$uprav=$db->query("UPDATE login
SET on_off='online',cas='".$den."'
WHERE jmeno_u='".$_SESSION['username']."'");
echo('<script>
alert("Jste přihlášen. Vítejte '.$_SESSION['username'].'");
window.location.href="/dobrovolnici/use/uvod.php";
</script>');
}
else
{
if($heslo_h !== $row_heslo['heslo'])
{
echo('<div class="alert">
<span class="closebtn">×</span>
Chyba, zadal jsi nesprávné heslo.
</div>');
}
}
}
}
}
}
}
}
?> |
||
| Keeehi Profil |
#2 · Zasláno: 26. 9. 2016, 23:10:24
Přepiš to podle tohoto pořadí
- SELECT heslo FROM login WHERE uživatel=$uživatel
- if nevrátí žádný záznam - - uživatel neexistuje - else - - if vyhledané heslo !== zadané heslo - - - špatné heslo - - else - - - //uživatel ověřen - - - SELECT práva FROM login WHERE uživatel=$uživatel
Pokud by uživatel měl mít možnost mít více práv současně, měl bys je přesunout do samostatné tabulky. Ten hash_hmac není vhodný na ukládání hesel. Použij nejlépe funkce password_hash a password_verify. Jsou určené přesně na to. Uživatelské vstupy escapuj. Takhle si útočník může zjistit vše, co máš v databázi. Když očekáváš maximálně jeden řádek ve výsledku z databáze, můžeš vynechat while, případně nahradit ifem if ($row = $dotaz -> fetch_assoc()) {
// řádek je v $row
} else {
// databáze nevrátila nic nebo dotaz selhal
} |
||
|
Časová prodleva: 9 let
|
|||
0