Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Diskuze: PHP Password Hashing

Aktivity
Avatar
softman23
Člen
Avatar
softman23:28.3.2015 21:34

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
Jan Lupčík
Tvůrce
Avatar
Odpovídá na softman23
Jan Lupčík:28.3.2015 21:42

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

Nahoru Odpovědět
28.3.2015 21:42
TruckersMP vývojář
Avatar
alfonz
Člen
Avatar
alfonz:28.3.2015 21:50

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

Nahoru Odpovědět
28.3.2015 21:50
lmao
Avatar
softman23
Člen
Avatar
Odpovídá na Jan Lupčík
softman23:28.3.2015 22:30

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

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

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

Nahoru Odpovědět
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
alfonz
Člen
Avatar
alfonz:28.3.2015 22:37

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
28.3.2015 22:37
lmao
Avatar
softman23
Člen
Avatar
Odpovídá na Dominik Gavrecký
softman23:28.3.2015 23:00
<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
alfonz
Člen
Avatar
alfonz:28.3.2015 23:54

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
lmao
Avatar
Nahoru Odpovědět
29.3.2015 0:19
Neaktivní uživatelský účet
Avatar
mkub
Tvůrce
Avatar
Odpovídá na softman23
mkub:29.3.2015 0:44
  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
Odpovídá na mkub
Uživatel sítě :29.3.2015 1:35

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 Uživatel sítě
1Pupik1989:29.3.2015 3:05

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
29.3.2015 3:05
Avatar
Richard
Člen
Avatar
Odpovídá na mkub
Richard:29.3.2015 3:36

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
29.3.2015 3:36
$action = $_GET['Life']; | Když dáš mínus, napiš proč!
Avatar
1Pupik1989
Člen
Avatar
1Pupik1989:29.3.2015 4:54

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
29.3.2015 4:54
Avatar
Odpovídá na 1Pupik1989
Neaktivní uživatel:29.3.2015 7:17

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
29.3.2015 7:17
Neaktivní uživatelský účet
Avatar
softman23
Člen
Avatar
Odpovídá na alfonz
softman23:29.3.2015 11:54

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

 
Nahoru Odpovědět
29.3.2015 11:54
Avatar
Odpovídá na 1Pupik1989
Uživatel sítě :29.3.2015 11:59

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
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:29.3.2015 12:02

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 Neaktivní uživatel
softman23:29.3.2015 12:20

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
Tvůrce
Avatar
Odpovídá na Richard
mkub:29.3.2015 14:18

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
29.3.2015 14:18
Avatar
mkub
Tvůrce
Avatar
Odpovídá na softman23
mkub:29.3.2015 14:21

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
29.3.2015 14:21
Avatar
softman23
Člen
Avatar
Odpovídá na mkub
softman23:29.3.2015 14:35

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:29.3.2015 15:32

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í
+2,50 Kč
Řešení problému
Nahoru Odpovědět
29.3.2015 15:32
$action = $_GET['Life']; | Když dáš mínus, napiš proč!
Avatar
Odpovídá na Richard
Uživatel sítě :29.3.2015 15:47

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 Uživatel sítě
Richard:29.3.2015 15:53

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
29.3.2015 15:53
$action = $_GET['Life']; | Když dáš mínus, napiš proč!
Avatar
softman23
Člen
Avatar
Odpovídá na Richard
softman23:29.3.2015 15:57

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