Autor Zpráva
kozusnik.jan
Profil *
Ahoj, potřebuji poradit ohledně md5. Mám na webu registraci, kde se uživatel zaregistruje, heslo se uloží zašifrované pomocí md5. To je v pohodě, ale když chci, aby se uživatel přihlásil a heslo, které vložil se zakédovalo pomocí md5 a pak porovnalo s heslem z DB, tak to nejde. Prosím poraĎte.
Zdroják přihlašování:
<?php
session_start();
$spojeni = mysql_connect("localhost", "root") or die ("Nelze najít databázi!");
mysql_select_db("womap") or die ("Nelze se pripojit k dané tabulce!");

if(isset($_POST['login'])) {
$vypislog = mysql_query( "SELECT id FROM `users` WHERE login ='".$_POST['login']."' AND heslo ='".md5($_POST['heslo'])."'") or die("Špatné pøihlašovací údaje!");
while ($zaznamlog = mysql_fetch_array($vypislog) ) {
$_SESSION['id'] = $zaznamlog['id']; 
 
}
Header("Location: index.php"); 
}
?>
<html>
<head>
<title></title>
</head>
<body>
<form action="<?php if(isset($PHP_SELF)) echo $PHP_SELF;?>" method="post" name="login" id="login">
<span class="leg">Login</span><br/><input type="text" name="login" id="login"><br/>
<span class="leg">Heslo</span><br/><input type="password" name="heslo" id="heslo"><br />
<input type="submit" name="log" id="log" value="Pøihlásit"><br/>
<h6>Ještì nejsi èlenem? Tak se <a href="register.php" >zaregistruj!</a></h6>
</form>
mckay
Profil
kozusnik.jan:
pak porovnalo s heslem z DB, tak to nejde.
Jak to nejde?

Je heslo v databázi jako md5(); hash?

Mimochodem, ještě trochu nepobírám, proč to děláš tak složitě.
kozusnik.jan
Profil *
No, nijak jinak mě to nenapadlo.
Heslo uložím do DB zakódovaná pomocí md5
Mastodont
Profil
Zašifrované ukládání hesla je IMHO dost zbytečné, když ho z formuláře posíláš nezašifrovaně.
kozusnik.jan
Profil *
aha, tak jak to mám udělat?
__construct
Profil
V tom čo si napísal chybu kvôli ktorej by to nemalo fungovať nevidím. Napíš čo konkrétne nejde, poprípade chybovú hlášku.
<mimo-téma>
do DB neukladáš ani „zakódované“ ani „zašifrované“ heslo, ale iba jeho otlačok algoritmom md5
</mimo-téma>
kozusnik.jan
Profil *
No, prostě když se zaregistruju, tak v pohodě, do DB se to zapíše, i to heslo zakódované. Když se chci přihlásit, tak se mi prostě nepřihlásí. Když je napsána ta kontrola heslo bez md5 kódování, tak to jede v pohodě. Když to tam dám, tak to dělá problémy.
ninja
Profil
Mastodont: Jak z uvedené ukázky je možné rozpoznat, že formulář není odesílán šifrovaně přes SSL?
Nox
Profil
ninja:
vzhledem k action/$PHP_SELF (registered globals?) tam není tam žádné ověření že je stránka na https verzi, takže se jde dostat i na http a odeslat... podle mě ne že by to nemohlo být odeslané přes SSL, ale není to zaručeno/vynuceno

kozusnik.jan:
nepoužívej md5, podle komentu v manuálu už ani sha1, takže při něčem vážným třeba hash('sha256', $password) (když opomenu salt)
kozusnik.jan
Profil *
ok, díky
Joker
Profil
kozusnik.jan:
První věc, sice teorie, ale častý zdroj nepochopení: Viz co píše __construct, MD5 není šifra.
Čili pokud se do databáze uloží md5($heslo), tak v databázi není zašifrované ani zakódované heslo, ale otisk (hash) hesla.

Nezaměňovat to je důležité proto, že výraz zakódované heslo vede spoustu lidí k zásadnímu omylu, že heslo jde z otisku také nějak dekódovat.

K problému:
Zkusil bych si vypsat ten hash zadávaného hesla a porovnat ho s tím, co je v databázi. Nejlépe na nějakém jednoduchém hesle a pokud to nebude stejné, nechat si zjistit skutečný MD5 toho hesla a porovnat, který je špatně. Například heslo má MD5 955db0b81ef1989b4a4dfeae8061a9a6, čili pokud heslo bude heslo a na nějaké straně bude něco jiného než tohle, tak tam vzniká chyba.
kozusnik.jan
Profil *
Aha, moc jsem nepochopil ale, jak mám teda vložit to zákodované heslo do DB?
Nox
Profil
kozusnik.jan:
nevkládáš zakódovaný heslo ale otisk hesla! :)

uživatel si vybere při registraci např. "heslo", takže v databázi se uloží 955db0b81ef1989b4a4dfeae8061a9a6
při přihlašování pak pošle "heslo", na to aplikuješ md5, vyjde ti 955db0b81ef1989b4a4dfeae8061a9a6, porovnáš s 955db0b81ef1989b4a4dfeae8061a9a6, zjistíš, že je to stejný

kdyby na heslo zapomněl a zkusil "letadlo", to se převede na 766b546867cdd93d1fc38dbec481c3e0, což zjistíš že není stejné jako to co je v databázi
kozusnik.jan
Profil *
No však jo, takhle jsme to dělal, ale nejelo mi to :-(, tak nevím, kde je chyba
panther
Profil
kozusnik.jan:
tak si vypiš hash z DB a ten, který s ním porovnáváš.
tiso
Profil
kozusnik.jan: vyzerá to, že sa učíš programovať a chceš si niečo spraviť. Skús začať s učením od základov, až keď jednoduché veci dokonale pochopíš tak pokračovať ďalej.
kozusnik.jan
Profil *
tiso:
Já už jsem jednoduché věci pochopil, jenom prostě pracuji s md5 a podobnými věcmi poprvé, tak si nevím rady
__construct
Profil
Čo Ti vypíše toto:
<?php
session_start();
$spojeni = mysql_connect("localhost", "root") or die ("Nelze najít databázi!");
mysql_select_db("womap") or die ("Nelze se pripojit k dané tabulce!");

if(isset($_POST['login'])) {
$vypislog = mysql_query( "SELECT id FROM `users` WHERE login ='".$_POST['login']."' AND heslo ='".md5($_POST['heslo'])."'") or die("Špatné pøihlašovací údaje!");
while ($zaznamlog = mysql_fetch_array($vypislog) ) {
$_SESSION['id'] = $zaznamlog['id']; 
 
}
//Header("Location: index.php"); 
echo "<pre>";
var_export($_SESSION);
echo "<br>\r\n";
var_export($zaznamlog);
echo "<br>\r\n";
echo md5($_POST['heslo']);
echo "</pre>";
}
?>
<html>
<head>
<title></title>
</head>
<body>
<form action="<?php if(isset($PHP_SELF)) echo $PHP_SELF;?>" method="post" name="login" id="login">
<span class="leg">Login</span><br/><input type="text" name="login" id="login"><br/>
<span class="leg">Heslo</span><br/><input type="password" name="heslo" id="heslo"><br />
<input type="submit" name="log" id="log" value="Pøihlásit"><br/>
<h6>Ještì nejsi èlenem? Tak se <a href="register.php" >zaregistruj!</a></h6>
</form>
kozusnik.jan
Profil *
Vypsalo mi to toto :
array (
  'login' => 'honza',
  'id' => '2',
)

false

74e644fa56d092d317e95370478ba996
jklasdf
Profil
Řeším podobný problém. Na localhostu mi šifrovaná registrace a přihlášení přes sha256 fungovala, ale po nahrání na server nefunguje.
Po vypsání na serveru jsou haše rozdílné. V databázi ten hash nahraný mám a výpis:
echo "Chyba: ".mysql_errno(). "; popis chyby: ".mysql_error()."<br>";
nehlásí žádné chyby. Přemýšlel jsem, jestli to sha256 na serveru nebude nějaké jiné, ale i když jsem si tam nahrál vlastní funkci, co jsem stáhl, hashe se neshodovali. Nevíte, čím by to mohlo být?
PostCC
Profil
jklasdf:
Jo. Třeba koncem řádku v hashovaném řetězci.
kozusnik.jan
Profil *
Já mám ten web zatím na počítači. Teprve ho budu nahrávat na server
jklasdf
Profil
Zjistil jsem, že problém bude asi v javascriptu do databáze se mně nahraje jenom sold a když si vypíšu proměnnou $_POST["heslo_upravene"], tak v ní nic není.
Zvláštní, že na localhostu mi to fungovalo:
<script type="text/javascript" src="pokus_sifra.js"></script>
<form action="registrace_s.php" method="post">
Přihlasovací jméno: <input name="prezdivka" maxlength="20">
Heslo: <input type="password" name="heslo" >
<input name="heslo_upravene" value="" >
<input type="submit" value="Registrovat" onclick="hmac(this.form);">
</form>
<script>
function hmac(f)
{
f['heslo_upravene'].value = SHA256(f['heslo'].value);
f['heslo'].value = '';
}
</script>
jklasdf
Profil
kozusnik.jan:
V tom kódu nahoře nemáš nikde javascript. Je to celý kód, nebo jen úsek? Kdyby to bylo celé tak:
heslo, které posíláš formulářem musíš před odesláním zašifrovat javascriptem (funkci si stáhneš) a pak to porovnat s tím, co máš v databázi.
Bývá to ještě složitější, že se k haši hesla ještě přidává náhodný řetězec a celé zahašuje a k haši hesla uloženému v databázi se přidává vždy stejný náhodný řetězec tzv. sold. Více o tom najdeš:
http://diskuse.jakpsatweb.cz/?action=vthread&forum=8&topic=61821&page=1

http://php.vrana.cz/bezpecne-prihlasovani-uzivatelu.php
jklasdf
Profil
jklasdf:
Tak svoji chybu už jsem našel. Nahrál jsem na server js knihovnu se špatným názvem (blbá chyba).
Zbývá už jenom vyřešit probém kozusnika.jana.
kozusnik.jan
Profil *
To je celý kód. V hlavičce mám sice i JavaScript, ale ten je kvůli něčeho jiného
jklasdf
Profil
kozusnik.jan:
To je celý kód.
Omlouvám se, zapomněl jsem na tebe. Musíš ten kód teda přepsat. Zašifrované to musí být před odesláním, jinak by to šifrování nemělo význam. Proto to dělá javascript a ne Php. Pod číslem #23 nahoře vidíš můj formulář a javascript na zašifrování.
Také ti může pomoct odkaz na tuto moji diskuzi, kde mně radí zkušený programátor Spaze:
http://forum.builder.cz/read.php?20,3295104,3295290
Joker
Profil
jklasdf:
heslo, které posíláš formulářem musíš před odesláním zašifrovat javascriptem (funkci si stáhneš)
Tohle se netýká uvedeného problému, spousta webů posílá nešifrované heslo a taky žije.
Šifrování hesla je úplně jiný problém než hash a myslím není vhodné to tu probírat dohromady, protože si to pak někdo nedbale přečte a vezme si z toho, že MD5=šifrování.

v databázi se přidává vždy stejný náhodný řetězec tzv. sold
Jednak bych poopravil, ne sold, ale salt, česky sůl, jednak upřesnil: Ta sůl musí být vždycky stejná pro daného uživatele, nemusí být úplně vždycky (pro všechny uživatele) stejná. Bezpečnější je, když má každý uživatel sůl jinou.

Ad kozusnik.jan, já bych stále doporučil si vypsat hash hesla z formuláře, vypsat hash proti kterému se kontroluje a jestli nebudou stejně, zjistit, který z nich je špatně.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0