Diskuze: PHP Password Hashing
V předchozím kvízu, Online test znalostí PHP, jsme si ověřili nabyté zkušenosti z kurzu.


Zobrazeno 26 zpráv z 26.
K personalizaci obsahu a reklam, poskytování funkcí sociálních médií a analýze naší návštěvnosti využíváme soubory cookie. Informace o tom, jak náš web používáte, sdílíme se svými partnery pro sociální média, inzerci a analýzy. Partneři tyto údaje mohou zkombinovat s dalšími informacemi, které jste jim poskytli nebo které získali v důsledku toho, že používáte jejich služby.
Používáme nezbytné cookies pro fungování webu a s tvým souhlasem také analytické a marketingové cookies.
Zajišťují základní funkce, bezpečnost a služby, které sis vyžádal. Nelze je vypnout.
| Služba | Poskytovatel | Účel | Cookies a úložiště | Doba uložení |
|---|---|---|---|---|
| ITnetwork | ITnetwork | Provoz webu, relace, přihlášení a uložení nastavení cookies. | PHPSESSID, auth_token, sid, itn_consent_impression, __Host-itn_consent | Relace až 1 rok |
| Google Tag Manager | Správa značek a načítání měřicích nástrojů webu. | Žádné | Neukládá se | |
| Google Fonts | Načítání typografie webu. | Úložiště řízené poskytovatelem | Dle podmínek poskytovatele | |
| Google Hosted Libraries | Načítání potřebných knihoven a stylů webu. | Úložiště řízené poskytovatelem | Dle podmínek poskytovatele | |
| Google reCAPTCHA | Ochrana formulářů a webu před zneužitím. | _GRECAPTCHA, rc::a, rc::b, rc::c, rc::f | Relace až 180 dní | |
| YouTube | Přehrávání vloženého video obsahu. | localStorage, IndexedDB; cookies after playback interaction | Relace až trvalé úložiště | |
| Vimeo | Vimeo | Přehrávání vloženého video obsahu. | __cf_bm, _cfuvid, vuid, localStorage, IndexedDB | Relace až 2 roky |
| Facebook Login | Meta | Přihlášení pomocí účtu třetí strany. | Úložiště řízené poskytovatelem | Relace až 1 rok |
| GoPay | GoPay | Zpracování uživatelem vyžádané platby. | Úložiště řízené poskytovatelem | Dle podmínek poskytovatele |
Pomáhají nám porozumět používání webu a zlepšovat ho.
| Služba | Poskytovatel | Účel | Cookies a úložiště | Doba uložení |
|---|---|---|---|---|
| Google Analytics 4 | Měření návštěvnosti a používání webu. | _ga, _ga_* | Až 2 roky | |
| Microsoft Clarity | Microsoft | Měření návštěvnosti a používání webu. | _clck, _clsk, _cltk | Relace až 1 rok |
Slouží k měření kampaní, personalizaci reklamy a marketingové komunikaci.
| Služba | Poskytovatel | Účel | Cookies a úložiště | Doba uložení |
|---|---|---|---|---|
| Google Ads | Měření kampaní, reklama a remarketing. | _gcl_au, _gcl_ls | Relace až 90 dní | |
| Meta Pixel | Meta | Měření kampaní, reklama a remarketing. | _fbp, _fbc, localStorage | Až 90 dní |
| Sklik | Seznam.cz | Měření kampaní, reklama a remarketing. | retargeting, sid, szn:* | Relace až trvalé úložiště |
| LinkedIn Insight | Měření kampaní, reklama a remarketing. | bcookie, li_gc, lidc, __cf_bm | Relace až 1 rok | |
| Ecomail | Ecomail.cz | Měření kampaní, reklama a remarketing. | ecmid, Úložiště řízené poskytovatelem | Dle podmínek poskytovatele |
| Atribuce kampaní ITnetwork | ITnetwork | Přiřazení návštěvy a objednávky ke kampani. | campaign_clid[*], user_session_context | Až 1 rok |
V předchozím kvízu, Online test znalostí PHP, jsme si ověřili nabyté zkušenosti z kurzu.


Musíš hashovat stejně jako při registraci heslo, tak i při
přihlášení. 
Skús nám ukázať tvoj source.
Opravdu bych md5 nepoužíval, je to jako by jsi uložil heslo
nezahashované. Používej PHP funkce:
Pro hashování - password_hash(heslo)
Pro ověřování - password_verify(heslo, hash)
Tyto funkce jsou vytvořené speciálně pro hashování hesel. A zatím jsou
neprolomitelné.
<html>
<head>
<title>Test</title>
</head>
<body>
<form action="" method="post">
<input type="text" name="user"><br />
<input type="password" name="password"><br />
<input type="submit" name="sub" value="Login in">
</form>
<form action="" method="post">
<input type="text" name="r_user"><br />
<input type="password" name="r_pass"><br />
<input type="submit" name="r_sub" value="Register">
</form>
<?php
if (isset($_POST['sub'])) {
include("login.php");
$i_user = $_POST['user'];
$i_pass = $_POST['password'];
$salt = "bgF7VGT4IKbBu16fbXEaZnqA2Oo";
$hash = md5($salt . $password);
$query = "SELECT * FROM uzivatele WHERE username='$i_user' AND password='$hash'";
$result = mysql_query($query);
if (mysql_num_rows($result) == 1) {
echo "<br />SuccesFully!";
}
else {
echo "<br /><p style='color: red;'>Incorrect Login!";
header("Refresh: 2; index.php");
}
}
if (isset($_POST['r_sub'])) {
include("login.php");
$ruser = $_POST['r_user'];
$rpass = $_POST['r_pass'];
$salt = "bgF7VGT4IKbBu16fbXEaZnqA2Oo";
$hash = md5($salt . $rpass);
$ruser = mysql_real_escape_string($ruser);
$rpass = mysql_real_escape_string($rpass);
$query = "INSERT INTO uzivatele (username,password) VALUES ('$ruser', '$hash')";
$result = mysql_query($query);
if ($result === TRUE) {
echo "<br />Registered Complete!";
header("Refresh: 2; index.php");
}
}
?>
</body>
</html>
Doufám, že tento kód se nikdy neobjeví na veřejnosti obsahuje spoustu nebezpečných technik. Chyba je v
$hash = md5($salt . $password);
protože proměná $password neexistuje.
Mezi nebezpečné techniky které používáš patří na příklad přímé
dosazování do SQL dotazu, používání mysql_* funkcí nebo používání md5
pro ukládání hesel. Doporučil bych ti používat bezpečnější password_*
funkce
funkcia header(); sluzi napr. na presmerovanie, ked este nebola ziadna hlavicka poslana
Ani SHA, prostě použít funkci k tomu určené (password_hash).
Pokud si rozluštil sha512, tak by si to mohl dát vědět, jinak v něm nevidím žádný problém. Ty jo? Po 5 letech bych asi musel měnit, takže bych klidně poděkoval. Sorry, sarkasmus přes net mi moc nejde.
Tvrdit že funkce mysql_* jsou samy o sobě nebezpečné je chyba. To že je nevhodné je používat kvůli zastaralosti je samozřejmě pravda.
Header fungovat může a nemusí, záleží na output bufferingu.
Taky mi poslední dobou připadá, že mysql_* funkce jsou nebezpečné. Proč bych tedy měl věřit mysqli nebo PDO, když to píší ti samý blázni?
Jediné co se stalo, tak prostě mysql_* funkce končí. Víc se toho neděje. Ti co tvrdí opak jsou sami nebezpeční a hodně málo čtou.
Nejde o to, že samotné funkce mysql_ jsou nebezpečné. Jde o to, že
neobsahují bezpečnostní prvky, které musíš ošetřovat manuálně, což za
prvé přidává na pravděpodobnosti SQL injekce a za druhé máš delší kód
(popřípadě používáš stále stejný kód, což OOP zakazuje). Aby můj
příspěvek byl úplný, našel jsem si "Proč nepoužívat mysql_*": 
Doesn't support:
- Non-blocking, asynchronous queries
- Prepared statements or parameterized queries
- Stored procedures
- Multiple Statements
- Transactions
- All of the functionality in MySQL 5.1
neobjevi,delal jsem to na rychlo,jenom kvůli tomu hasovani 
Jak rozluštil? Na tzv. prolomení hashů existují služby, např. cracstation, který mají předem vygenerované tabulky pro hashe, jejích DB čistého textu zabírá zhruba 200GB..
Jde o to, že tyto hashe jsou příliš rychlé, password_hash má v sobě
zabudovaný i salt, ke každému uživateli.- To znamená, že ho nemusíš
generovat.
Upřímně, nevím proč v tomto ohledu radíš, když o tom zřejmě moc
nevíš a k tomu píšeš docela nesmysli..
Přesně tak,jsou jen zastaralé 
a header mi faká jak má
nechápu proč by něměl 
Tak jsem nakonec použil password_* ale stale mi to hlasi chybu

funkcie mysql_ su nebezpecne v tom, ze sa musia rucne osetrovat a umoznuju utok napr. typu SQL Injection, co je jeden z najnebezpecnejsich utokov na databazu - umoznuje lubovolnu manipulaciu s nou - dokonca aj celu databazu dropnut
tie funkcie su zastarale a nebezpecne v tom, ze neumoznuju automaticku
ochranu voci SQL injection...
ocividne Richard necita stranky PHP.net
jo,ale existujou funkce voci SQL injection 
jen to chce hlavu...
už jsem ho přepsal 
<?php
$host = "localhost";
$usr = "root";
$pass = "";
$db = "mydb";
$conn = mysqli_connect($host, $usr, $pass, $db);
if(mysqli_connect_error()){
echo "Failed:" . mysqli_connect_error();
}
echo "Connected!";
?>
Přemýšlel jsem jestli vůbec reagovat, protože schytám spoustu mínusů, ale nedá mi to.
Mysql_* jsou zastaralé, ne nebezpečné. Taky můžu říct že panelák je nebezpečný, protože když skočíš z balkonu tak to nedopadne dobře. Proč by někdo skákal z balkonu? Proč by někdo neošetřoval sql vstupy? Je to naprosto základní věc kterou se každý učí při začátcích práce s databází a každý (ať využívá výhod automatického ošetřování nebo ne) to musí zvládat. A tím zvládat nemyslím napsat fci mysql_real_escape_string.
Automatické ošetřování je fajn, ušetří práci, čas. Ale ve výsledku tyto a podobné ulehčení produkují spoustu "programátorů". To že se někdo našprtá tutorial o frameworku a najednou se nazývá profi programátorem je dnes běžná praxe, to že spousta profi "programátorů" nezvládá základy je taktéž naprosto běžné.
Když nabírám programátory, je mi celkem jedno že dokážou vyjmenovat trilion funkcí z dokumentace, záleží jenom na tom jestli vědí jak ty funkce fungují, jestli dokážou napsat bez přemýšlení vlastní funkci co bude suplovat tu ze standartní knihovny. Dopadá to tak že u 90% není první reakce klapání klávesnice ale "eeeeh hmmm mmmm proč?".
Programování by mělo být o intelektu, přemýšlení, vědomostech a zkušenostech, ne o slepování toho co si člověk pamatuje z tutoriálů.
Suma sumárum, mysql_* není nebezpečná jen proto že umožňuje udělat chybu. Jen modernější ovladače poskytují větší bezpečnost. A rozhodně to neznamená, že pokud používám moderní ovladače, že nemusím vědět jak fungují.
A teď do mě, jsem zvědavý kdo se ozve.
Je fakt, že máme rok 2015 tak proč používat zastaralý ovladač, který bude odstraněn.
S bezpečností naprosto souhlasím, pokud vím jak to ošetřit, není problém to používat. Ale proč nepoužít novější ovladač, který má spoustu nových funkcí.
Neříkám, že používat mysql_ je vyloženě špatné, ale proč nepoužít něco modernějšího a na obsluhu lehčího?
V PDO se dá udělat taky SQL injekce, když je špatně použiješ.
Však jsem nepsal že mysql_* je super, naopak zastávám názor že je zastaralý a používat by se neměl. Říkám jen že je to dobrý studijní materiál, protože člověk skvěle pochopí (právě díky např. absenci automatického escapování) základy bezpečnosti při práci s sql. Pokud produkuji kód, musím znát bezpečnostní rizika, musím vědět jak může dojít k průniku a musím vědět jakým způsobem funguje ochrana a to i když to za mě dělá mysql ovladač.
Dávam like, hezky napsaný a, máš pravdu je to tak bohužel, spousta lidi
ani neví s čeho a, co je PHP... já jsem tu možnost učit se IT nedostal,tak
se učím s knižek,google atd...
a za tu dobu jsem potkal lidi, co jse vytahovali že mají nějakej ten papír

a neuměli dát, pořádně dohromady jednu Stránku
fakt špatný 
Zobrazeno 26 zpráv z 26.