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

Člen

Zobrazeno 26 zpráv z 26.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
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.