02.10.2022 16:41
1
Zdravím, může mě tu prosím někdo poradit? Vytvořil jsem si login system v PHP, kde se přihlašuje skrze  napojení na databázi. K přihlášení jsem měl tyto údaje:

uživatelské jméno nebo email
heslo

Později jsem se rozhodl, že odeberu uživatelské jméno a nechám jen email k přihlášení, aby při registraci to bylo jednoduší pro nové uživatele. Script funguje jak má, jenomže mi tam zbyl jeden řádek, který potřebují upravit:
Kód:
$sql = "SELECT * FROM uzivatele WHERE Emailuser=? OR login_name=?;";
Tento kód potřebují mít takto:

Kód:
$sql = "SELECT * FROM uzivatele WHERE Emailuser=?";
nebo takto:
Kód:
$sql = "SELECT * FROM uzivatele WHERE Emailuser=?;";
aby login_name tam nebylo vůbec k dispozici... jenže jakmile odeberu login_name tak se potom nedá přihlásit... nevím kde je chyba..

Zde je celý kod:

PHP kód:
if (isset($_POST['login'])){

include(
'db.php'); // Připojení k databazi
  
  $uzivatel 
$_POST['mailuid'];
  $heslo $_POST['pwd'];

//doba pamatovani v cookies
if ($_POST['doba'] === '5') {
$doba_trvani time()+300;//5 minut ve vteřinach
}elseif ( $_POST['doba'] === '10' ) {
$doba_trvani time()+600;//10 minut ve vteřinach
}elseif ( $_POST['doba'] === '30' ) {
$doba_trvani time()+1800;//30 minut ve vteřinach
}elseif ( $_POST['doba'] === 'hodina' ) {
$doba_trvani time()+3600;
}elseif ( 
$_POST['doba'] === 'hodin' ) {
$doba_trvani time()+14400;
}elseif ( 
$_POST['doba'] === 'den' ) {
$doba_trvani time()+86400;
}elseif ( 
$_POST['doba'] === 'dny' ) {
$doba_trvani time()+259200;
}elseif ( 
$_POST['doba'] === 'tyden' ) {
$doba_trvani time()+604800;
}elseif ( 
$_POST['doba'] === 'mesic' ) {
$doba_trvani time()+2592000;
}elseif ( 
$_POST['doba'] === 'rok' ) {
$doba_trvani time()+31556952;
}
  
  
  
if (empty($uzivatel) || empty($heslo) ) {
    header("Location: ../login.php?error=prazdnepole");
    exit();
  }
  else {
    $sql "SELECT * FROM uzivatele WHERE Emailuser=? OR login_name=?;";
    $stmt mysqli_stmt_init($conn);
    if (!mysqli_stmt_prepare($stmt$sql) ) {
      header("Location: ../login.php?error=sqlchyba");
    exit();
    }
    else {
    
    mysqli_stmt_bind_param
($stmt"ss"$uzivatel$heslo);
    mysqli_stmt_execute($stmt);
    $result mysqli_stmt_get_result($stmt);
    
    
if ($row mysqli_fetch_assoc($result) ) {
      $pwdCheck password_verify($heslo$row['Heslo']);
      
      
if ($pwdCheck == false) {
        header("Location: ../login.php?error=spatneheslo");
      exit(); } 
      
      
else if ($pwdCheck == true) {
      
          
if ($row['uroven'] == 'admin') {
      
        
        session_start
();
        $_SESSION['IDusers'] = $row['IDusers']; 
        $_SESSION['Emailuser'] = $row['Emailuser'];    
              
        
if(isset($_REQUEST['pamatovat'])){
        // pamatovani prihlaseni v cookie
        setcookie("userlogin"$_SESSION['IDusers'], $doba_trvani'/'); 
      } else {
        unset($_COOKIE['userlogin']); 
      }
      
    header
("Location: ../?login=prihlasen");
      exit();  
      
          
} else {
      header("Location: ../login.php?error=zakaznik");
          }
      
      
      
      

      else {
        header("Location: ../login.php?error=spatneheslo");
      exit();
      }
      
      
}
    
    
else {
        header("Location: ../login.php?error=uzivatelneexistuje");
      exit();
    }
    
    
}
    
  
}
  
}


else {
      header("Location: ../login.php");
    exit();

02.10.2022 19:51
2
podla mna je chyba v tej ; za otaznikom :)
03.10.2022 06:55
3
První věc - podle kódu to vypadá, ze heslo v DB ukladate v plaintextu. To je velký bezpečnostní problém - v DB ukladejte pouze nějaký hash hesla a pak porovnavejte pouze hash hesla co zadal uživatel s hashem z databáze ( MD5 hash už je zastaralý, doporučuji minimálně SHA1 )
Druha věc - použijte tu druhou možnost SQL dotazu, kde máte středník jak před uvozovkami, tak za nima. Středník patří jak na konec SQL dotazu, tak na konec PHP řádky.
Třetí věc - pošlete sem i chybovou hlášku, kterou to vypisuje, jinak chyba půjde těžko debuggovat.
25.10.2022 05:01
4
si najdi všude, kde máš login_name a pak si to uprav/smaž
25.10.2022 11:01
5
Ahoj, podle mě je problém někde tady
Kód:
  else {
    $sql = "SELECT * FROM uzivatele WHERE Emailuser=? OR login_name=?;";
    $stmt = mysqli_stmt_init($conn);
    if (!mysqli_stmt_prepare($stmt, $sql) ) {
      header("Location: ../login.php?error=sqlchyba");
    exit();
    }
    else {
    
    mysqli_stmt_bind_param($stmt, "ss", $uzivatel, $heslo);
    mysqli_stmt_execute($stmt);
    $result = mysqli_stmt_get_result($stmt);
Posíláš nesmyslně $uzivatel a $heslo, a pritom v dotazu je heslo dosazovano za login_name 
Pokud login_name odebereš, je potřeba upravit i ten bind_param
Ale jak bylo zmíněno výše, pošli případně chybovou hlášku