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 <?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 |
#2 · Zasláno: 3. 3. 2025, 16:22:16
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 <?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 |
#3 · Zasláno: 3. 3. 2025, 16:55:43
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 |
#5 · Zasláno: 5. 3. 2025, 10:16:53
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 |
#6 · Zasláno: 5. 3. 2025, 12:27:12
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 |
#7 · Zasláno: 6. 3. 2025, 18:15:20
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. |
||
Časová prodleva: 18 dní
|
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