Autor Zpráva
Dydy
Profil *
Dobry den mam authme login script vsetko ide ako ma len ak napisem zle meno aj heslo tak mi to vyhodi toto:
Notice: Undefined offset: 2 in localhost\Web\login.php on line 33
Notice: Undefined offset: 2 in localhost\Web\login.php on line 34
Tato přezdívka nebyla nalezena.

Ale ked dam spravne meno a zle heslo tak mi to vypise iba:
Toto heslo není správné.

Prosim poradte ako odstranim tento error
Tu je code:
<?php
$db_host         =     "localhost";     
$db_uzivatel     =     "root";          
$db_heslo        =     "12345";          
$db_databaze     =     "web";      
$db_tabulka      =     "authme";       
$hash            =     "SHA256";        

session_start();
if(isset($_SESSION['uzivatel'])) {

header ("Location: Domov.php");
exit;
} else {
$mysqli = new mysqli($db_host, $db_uzivatel, $db_heslo, $db_databaze);
if ($mysqli->connect_errno)
{
   echo "Failed to connect to MySQL: " . $mysqli->connect_error;
   exit();
}
if (isset($_POST['nick']) && isset($_POST['heslo']))
{
   if (!empty($_POST['nick']) && !empty($_POST['heslo']))
   {
            $nick = preg_replace('/\s+/', '', $_POST['nick']);
      $heslo = preg_replace('/\s+/', '', $_POST['heslo']);
      $result = $mysqli->query("SELECT password FROM ".$db_tabulka." WHERE username = '".$nick."'");
      $row = $result->fetch_assoc();
      switch ($hash) {
            case 'SHA256':
                $userPasswordField = explode('$', $row['password']);
            $heslo = hash('sha256', $heslo);
            $heslo .= $userPasswordField[2];
            $heslo = '$SHA$' . $userPasswordField[2] . '$' . hash('sha256', $heslo);
            $heslicko = $heslo === $row['password'];
                break;
        }
      $ip = $_SERVER['REMOTE_ADDR'];
      
      $query_nick = mysqli_query($mysqli, "SELECT username FROM ".$db_tabulka." WHERE username = '".$nick."'");
      if ($data_nick = mysqli_fetch_array($query_nick))
      {
         if ($heslicko)
         {
            $_SESSION['uzivatel'] = $nick;

header ("Location: administrace.php");
exit;
           }
         else
         {
            echo "<div style='color: red;'><strong>Toto heslo není správné.</strong></div>";
         }
      }
      else
      {
         echo "<div style='color: red;'><strong>Tato přezdívka nebyla nalezena.</strong></div>";
      }
   }
}
}
?>
<!DOCTYPE html
<html> 
        <head>
                <meta charset="utf-8" />
                <title>GRLCraft</title>
                <link rel="stylesheet" href="CSS/Login.css" type="text/css" />
        </head>
<body><center>
         <article>
          <div id="centrovac">
            <section>
                <br>
                <div class="cistic"></div>
                   <center>
                    <div style="margin:80px auto 40px;">
                    <div id="logo">Login</div>
                    </div>
                    <div style="margin:80px auto 40px;">
                     <center>
                      <form method='post'>
                       <input type="text" class="text-input" name='nick' placeholder="Nick na serveri">
                       <div style="margin:10px auto 10px;">
                       <input type="password" class="text-input" name='heslo' placeholder="Heslo">
                       <div style="margin:10px auto 10px;">
                       <button type="submit" class="button">Přihlásit!</button>
                      </form>
                       <div style="margin:100px auto 50px;">
                       <p>Ak niesi zaregistrovany na serveri<br> pokracuj v Offline rezime</p>
                       <a href="Domov.php" class="button">Offline rezim</a>
                     </center>
                    </div>
                   </center><br>
            </section>
          <div class="cistic"></div>
          </div>
         </article>
</center></body>
</html>
lionel messi
Profil
Dydy:
Dotazy na r. 27, resp. 40 nezlyhajú? Čo sa týka bezpečnosti, chcelo by to použiť escapovanie.

Čo vypíše var_dump($userPasswordField) (po r. 31)?
Dydy
Profil *
Ako kde vypise ?
lionel messi
Profil
Dydy:
Ako kde vypise ?
Za riadok 31 pridaj:

var_dump($userPasswordField);

a sleduj, čo sa vypíše do stránky.
Dydy
Profil *
Ked napisem spravne meno a zle heslo tak vypise toto:
array(4) { [0]=> string(0) "" [1]=> string(3) "SHA" [2]=> string(16) "e0f843da2c5f59f2" [3]=> string(64) "d9f66e024656a03d9b2151007a30a17ef5f98f7d9ab22c5e445e25efcdaaa687" }
Toto heslo není správné.

A ked dam zle meno aj heslo tak vypise toto:
array(1) { [0]=> string(0) "" } 
Notice: Undefined offset: 2 in C:\xampp\htdocs\Web\login.php on line 34

Notice: Undefined offset: 2 in C:\xampp\htdocs\Web\login.php on line 35
Tato přezdívka nebyla nalezena



A na ridku 34 je toto:
$heslo .= $userPasswordField[2];

Riadok 35 je toto:
$heslo = '$SHA$' . $userPasswordField[2] . '$' . hash('sha256', $heslo);
Keeehi
Profil
Je to velmi divný kód, takže se mi to nechce zkoumat, ale chyba je jasná. Když jméno neexistuje, databáze vrátí prázný záznam -> $row je null. Stačí tedy nejprve ověřit, zda se něco vrátilo a pokud ano, tak s tím pracovat.
if ($row) { ...
Tomáš123
Profil
Dydy:
Alebo to celé prerobiť. Niektoré podmienky nemajú druhú časť, niektoré sa zbytočne opakujú, niektoré operácie sa za určitých okolností prevedú zbytočne (pripojenie do databázy). Takto sprasený kód si vybral svoju daň.

Keeehi:
Možno by šlo aj (kdesi pred výpisom):
if (!$row) {
  echo "Nesprávne prihlasovacie meno alebo heslo";
  exit();
}
Dydy
Profil *
Nebolo by lepsie keby ste mi napisaly novy kod ?


Lebo nesom najlepsi z php
Tomáš123
Profil
Dydy:
Nebolo.
Dydy
Profil *
Aspon sa neda nejako skryt ten error aby ho nvypisovalo do stranky
Tomáš123
Profil
Dydy:
Vypisovanie chýb sa samozrejme dá vypnúť alebo sa to dá provizórne ošetriť už vyššie spomínaným spôsobom (výpisu chýb by si mal ale zamedziť aj tak; prečítaj si o tom na www.onehelp.cz/onebit/kb/error_reporting).
lionel messi
Profil
Dydy:
Aspon sa neda nejako skryt ten error aby ho nvypisovalo do stranky
Na ostrom serveri má byť výpis chýb vždy vypnutý (pomocou konfiguračnej direktívy display_errors(Off) v php.ini), čo je najideálnejšie riešenie aj pre tvoj prípad.

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