Diskuze: PHP Password Hashing

PHP PHP PHP Password Hashing American English version English version

Avatar
softman23
Člen
Avatar
softman23:

Zdravim, Potrebuju poradit s hasovaní hesla

problem je v tom,že zaregistruju,ale přihlasit se mi už nedaří :/

 
Odpovědět 28.3.2015 21:34
Avatar
IT Man
Redaktor
Avatar
Odpovídá na softman23
IT Man:

Musíš hashovat stejně jako při registraci heslo, tak i při přihlášení. :)

Nahoru Odpovědět  +2 28.3.2015 21:42
Když nevíš jak dál, podá ti ruku někdo, od koho by jsi to nečekal. A tu šanci musíš přijmout!
Avatar
Denis Homolík (Alfonz):

S takovým popisem problému můžeme jenom hádat co to způsobuje.

Nahoru Odpovědět  +1 28.3.2015 21:50
Vše je možné, dokud si to myslíte!
Avatar
softman23
Člen
Avatar
Odpovídá na IT Man
softman23:

to jsem udělal :)
pužil jsem md5, tak nevim o_O

 
Nahoru Odpovědět 28.3.2015 22:30
Avatar
Dominik Gavrecký:

Skús nám ukázať tvoj source.

Nahoru Odpovědět  +1 28.3.2015 22:34
Hlupák nie je ten kto niečo nevie, hlupákom sa stávaš v momente keď sa na to bojíš opýtať.
Avatar
Denis Homolík (Alfonz):

Opravdu bych md5 nepoužíval, je to jako by jsi uložil heslo nezahashované. Používej PHP funkce:
Pro hashování - password_hash(hes­lo)
Pro ověřování - password_veri­fy(heslo, hash)
Tyto funkce jsou vytvořené speciálně pro hashování hesel. A zatím jsou neprolomitelné.

Nahoru Odpovědět  ±0 28.3.2015 22:37
Vše je možné, dokud si to myslíte!
Avatar
softman23
Člen
Avatar
Odpovídá na Dominik Gavrecký
softman23:
<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>
 
Nahoru Odpovědět 28.3.2015 23:00
Avatar
Denis Homolík (Alfonz):

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

Nahoru Odpovědět 28.3.2015 23:54
Vše je možné, dokud si to myslíte!
Avatar
BlugW
Redaktor
Avatar
Nahoru Odpovědět 29.3.2015 0:19
Pořiď si mac na www.appletrh.cz. Novinky a zajímavosti ze světa Apple na https://www.applemagazin.eu
Avatar
mkub
Redaktor
Avatar
Odpovídá na softman23
mkub:
  1. vidim tu zavananie spagetizacie (php kod by som pouzil hned na zaciatku a na zaciatok by som vlozil aj funkcie na pracu s coockies a so session)
  2. uplne by som sa vyhol funkciam mysql_ - su nebezpecne, nedoporucuju sa pouzivat a v najblizsich verziach jazyka PHP budu vyhodene, radsej by som pouzil ako nahradu mysqli, alebo rovno pristupovat k databazi cez pdo
  3. funkcie md5 by som na vytvaranie hash hesla nepouzival - je to prekonane, radsej by som pouzil SHA1, alebo inu sifru
  4. dalej si myslim, ze header(); ti tu nebude fungovat, lebo funkcia header(); posiela hlavicky a ked uz je raz poslana hlavicka, tak ti vypise chybu ohladne hlavicky

funkcia header(); sluzi napr. na presmerovanie, ked este nebola ziadna hlavicka poslana

 
Nahoru Odpovědět 29.3.2015 0:44
Avatar
Marek Z.
Redaktor
Avatar
Odpovídá na mkub
Marek Z.:

Ani SHA, prostě použít funkci k tomu určené (password_hash).

Nahoru Odpovědět 29.3.2015 1:35
Chybami se člověk učí, běžte se učit jinam!
Avatar
1Pupik1989
Člen
Avatar
Odpovídá na Marek Z.
1Pupik1989:

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.

 
Nahoru Odpovědět  -1 29.3.2015 3:05
Avatar
Richard
Člen
Avatar
Odpovídá na mkub
Richard:

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.

Nahoru Odpovědět  ±0 29.3.2015 3:36
$action = $_GET['Life']; | Když dáš mínus, napiš proč!
Avatar
1Pupik1989
Člen
Avatar
1Pupik1989:

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.

Editováno 29.3.2015 4:55
 
Nahoru Odpovědět  -3 29.3.2015 4:54
Avatar
Inoue Yūki
Redaktor
Avatar
Odpovídá na 1Pupik1989
Inoue Yūki:

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_*": :)

  • Not under active development
  • Officially deprecated (as of PHP 5.5. Will be removed in PHP 7.)
  • Lacks an OO interface

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

Editováno 29.3.2015 7:18
Nahoru Odpovědět  +5 29.3.2015 7:17
Avatar
softman23
Člen
Avatar
Odpovídá na Denis Homolík (Alfonz)
softman23:

neobjevi,delal jsem to na rychlo,jenom kvůli tomu hasovani :)

 
Nahoru Odpovědět 29.3.2015 11:54
Avatar
Marek Z.
Redaktor
Avatar
Odpovídá na 1Pupik1989
Marek Z.:

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..

Nahoru Odpovědět  -1 29.3.2015 11:59
Chybami se člověk učí, běžte se učit jinam!
Avatar
softman23
Člen
Avatar
Odpovídá na Richard
softman23:

Přesně tak,jsou jen zastaralé ;)

a header mi faká jak má :) nechápu proč by něměl o_O

 
Nahoru Odpovědět 29.3.2015 12:02
Avatar
softman23
Člen
Avatar
Odpovídá na Inoue Yūki
softman23:

Tak jsem nakonec použil password_* ale stale mi to hlasi chybu o_O :(

 
Nahoru Odpovědět 29.3.2015 12:20
Avatar
mkub
Redaktor
Avatar
Odpovídá na Richard
mkub:

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

 
Nahoru Odpovědět  +1 29.3.2015 14:18
Avatar
mkub
Redaktor
Avatar
Odpovídá na softman23
mkub:

tie funkcie su zastarale a nebezpecne v tom, ze neumoznuju automaticku ochranu voci SQL injection...
ocividne Richard necita stranky PHP.net

 
Nahoru Odpovědět  +2 29.3.2015 14:21
Avatar
softman23
Člen
Avatar
Odpovídá na mkub
softman23:

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!";

?>
 
Nahoru Odpovědět 29.3.2015 14:35
Avatar
Richard
Člen
Avatar
Odpovídá na mkub
Richard:

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_es­cape_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.

Editováno 29.3.2015 15:32
Akceptované řešení
+20 Zkušeností
+1 bodů
Řešení problému
Nahoru Odpovědět  +4 29.3.2015 15:32
$action = $_GET['Life']; | Když dáš mínus, napiš proč!
Avatar
Marek Z.
Redaktor
Avatar
Odpovídá na Richard
Marek Z.:

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š.

Nahoru Odpovědět 29.3.2015 15:47
Chybami se člověk učí, běžte se učit jinam!
Avatar
Richard
Člen
Avatar
Odpovídá na Marek Z.
Richard:

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č.

Nahoru Odpovědět  +2 29.3.2015 15:53
$action = $_GET['Life']; | Když dáš mínus, napiš proč!
Avatar
softman23
Člen
Avatar
Odpovídá na Richard
softman23:

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 :D
a neuměli dát, pořádně dohromady jednu Stránku :D fakt špatný :@

 
Nahoru Odpovědět  +2 29.3.2015 15:57
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 26 zpráv z 26.