Autor Zpráva
jarX
Profil
Zdravím, potřeboval bych poradit se scriptem v přihlašování do administrace webu. V PHP 7 funguje, v PHP 8.2. už ně dokázal by mě někdo pomoct. Předem moc děkuji. Přikládám script, který mám na webu.
1<?php
2  
3include ("db3.php"); 
4 if(isset($_POST["submit"]))
5  {                                                                                                                                                                              
6 
7$jmeno = mysqli_real_escape_string($spojeni,$_POST["jmeno2"]);
8$heslo = mysqli_real_escape_string($spojeni,$_POST["heslo"]);
9 
10    
11$dotaz = mysqli_query($spojeni,"select * from uzivatele where jmeno2 = '$jmeno' and heslo = '$heslo'");
12$overeni = mysqli_num_rows($dotaz);
13$row = mysqli_fetch_assoc($dotaz);
14 $typCH = "".$_POST["typCH"]."";
15 
16if($overeni == 1) {
17 
18   $_SESSION['objednavka'] = stripslashes($objednavka);
19    $_SESSION['jmeno2'] = stripslashes($jmeno);
20    $_SESSION['heslo'] = $row["heslo"];
21    header("Location: $typCH.php");
22    die();
23    echo "";
24    }
25    else
26    {
27    echo " ";   
28  }
29  } 
30   
31                 
32   
33?>
<?php
  
include ("db3.php"); 
 if(isset($_POST["submit"]))
  {                                                                                                                                                                              
 
$jmeno mysqli_real_escape_string($spojeni,$_POST["jmeno2"]);
$heslo mysqli_real_escape_string($spojeni,$_POST["heslo"]);
 
    
$dotaz mysqli_query($spojeni,"select * from uzivatele where jmeno2 = '$jmeno' and heslo = '$heslo'");
$overeni mysqli_num_rows($dotaz);
$row mysqli_fetch_assoc($dotaz);
 $typCH "".$_POST["typCH"]."";
 
if($overeni == 1) {
 
   $_SESSION['objednavka'] = stripslashes($objednavka);
    $_SESSION['jmeno2'] = stripslashes($jmeno);
    $_SESSION['heslo'] = $row["heslo"];
    header("Location$typCH.php");
    die();
    echo "";
    }
    else
    {
    echo " ";   
  }
  } 
   
                 
   
?>

Moderátor Kajman: Vkládej prosím kódy mezi značky [pre] a [/pre] (stačí kliknout na ).
Str4wberry
Profil
V PHP 8.2 může být problém s několika věcmi v tomto kódu:
1. Nevytvořená session – před použitím $_SESSION musí být spuštěna session_start();.
2. Použití mysqli_num_rows – pokud mysqli_query selže, mysqli_num_rows vyhodí chybu.
3. Použití mysqli_real_escape_string pro heslo – v moderním PHP by mělo být heslo hashované (password_hash()) a ověřované přes password_verify().
4. Použití stripslashes() – není nutné a v moderních verzích PHP nemá význam.
5. SQL Injection – použití proměnných přímo v SQL dotazu bez přípravy (prepared statements).

Opravená verze kódu:
1<?php
2session_start();
3include("db3.php");
4 
5if (isset($_POST["submit"])) {
6    $jmeno = trim($_POST["jmeno2"]);
7    $heslo = trim($_POST["heslo"]);
8    $typCH = trim($_POST["typCH"]);
9 
10    if (empty($jmeno) || empty($heslo)) {
11        echo "Zadejte přihlašovací údaje.";
12        exit;
13    }
14 
15    // Použití prepared statements pro bezpečnost
16    $stmt = mysqli_prepare($spojeni, "SELECT heslo FROM uzivatele WHERE jmeno2 = ?");
17    mysqli_stmt_bind_param($stmt, "s", $jmeno);
18    mysqli_stmt_execute($stmt);
19    $result = mysqli_stmt_get_result($stmt);
20 
21    if ($row = mysqli_fetch_assoc($result)) {
22        if (password_verify($heslo, $row["heslo"])) {
23            $_SESSION['jmeno2'] = $jmeno;
24            header("Location: $typCH.php");
25            exit;
26        } else {
27            echo "Neplatné heslo.";
28        }
29    } else {
30        echo "Uživatel nenalezen.";
31    }
32 
33    mysqli_stmt_close($stmt);
34}
35 
36?>
<?php
session_start();
include("db3.php");
 
if (isset($_POST["submit"])) {
    $jmeno trim($_POST["jmeno2"]);
    $heslo trim($_POST["heslo"]);
    $typCH trim($_POST["typCH"]);
 
    if (empty($jmeno) || empty($heslo)) {
        echo "Zadejte přihlašovací údaje.";
        exit;
    }
 
    // Použití prepared statements pro bezpečnost
    $stmt mysqli_prepare($spojeni"SELECT heslo FROM uzivatele WHERE jmeno2 = ?");
    mysqli_stmt_bind_param($stmt"s"$jmeno);
    mysqli_stmt_execute($stmt);
    $result = mysqli_stmt_get_result($stmt);
 
    if ($row mysqli_fetch_assoc($result)) {
        if (password_verify($heslo$row["heslo"])) {
            $_SESSION['jmeno2'] = $jmeno;
            header("Location$typCH.php");
            exit;
        } else {
            echo "Neplatné heslo.";
        }
    } else {
        echo "Uživatel nenalezen.";
    }
 
    mysqli_stmt_close($stmt);
}
 
?>
jarX
Profil
Díky moc za pomoc s kódem, jen mě nefunguje přihlášení, hlasí mě to neplatné heslo, heslo a jméno beru z databáze Mysql. Session_start mám spuštené nahoře ve scriptu, můžete mě ještě pomoct, díky předem moc za pomoc s kódem.
anonym_
Profil *
jarX:
Jasně, že to hlásí neplatné heslo, když S pracuje s hashem (správně), zatímco ty jako vandrák před 25 lety ukládáš heslo do DB v plaintextu.


Doplním odkazy: www.php.net/manual/en/function.password-verify.php, www.php.net/manual/en/function.password-hash.php
jarX
Profil
Zdravím Bohumile,
koukal jsem na váš web JE ČAS, měl bych na vás velkou prosbu, pomoct ještě s kódem přihlašování, je to hasovaní hesla v PHP 8 nutné nešel by upravit ten můj kod přihlašování co mě funguje v PHP 7.4.
Díky moc za pomoc.
Keeehi
Profil
Technicky to samozřejmě možné je. Ale vaši zákazníci z toho asi nejsou nadšení. U dobré poloviny máte teď přístup do jejich emailových schránek, jelikož používají stejné heslo všude. Jasně, je to jejich chyba že si při registraci zvolí stejné heslo ale vy tomu ještě pomáháte. A až vám někdo databázi vykrade, budou z toho nadšení úplně nejvíc.
Pokud heslo v čitelné podobě ukládat nebudete, nemůže ho při úniku databáze útočník zneužít. Takže otázka nemá znít: Jak odstranit toto bezpečnostní opatření? Ale: Co mám udělat, aby mi to i s opatřením fungovalo správně.

A odpověď je, všechna hesla v plaintextu v databázi také zahashovat. Prostě každé heslo vzít a nahradit ho jeho hashem.
jarX
Profil
Keeehi:
Už jsem to vyřešil, začínám z hashováním, už mě přihlašování funguje. Díky za pomoc.
Toto vlákno je staré, již dlouho do něj nikdo nepřispíval.

Informace a odkazy zde uváděné už nemusejí být aktuální. Nechcete-li řešit zde uvedenou konkrétní otázku, založte si vlastní vlákno, nepište do tohoto. Vložíte-li sem nyní příspěvek, upoutáte pozornost mnoha lidí a někteří z nich si jen kvůli vám přečtou i všechny předcházející příspěvky. Předpokládáte-li, že váš text skutečně bude hodnotný, stiskněte následující tlačítko:


Běda vám, jestli to bude blábol.

0