Autor Zpráva
Nuimi
Profil
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
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
}

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: