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: 8 let
|
0