Autor | Zpráva | ||
---|---|---|---|
atbobcz Profil |
#1 · Zasláno: 23. 1. 2016, 22:03:11
Dobry den, po hodně dlouhém bojování se mi konečně podařilo připojit na databázi ale teď mi to pro změnu vyhodilo tuhle hlášku. MySQL chyba 1054 - Unknown column 'salt' in 'field list' Nemám ani ponětí o co jde. Na googlu jsem toho taky moc nepořídil. Tak mě prosím zkuste někdo popostrčit. Já v té databázi žádný sloupek "salt" nemám.
|
||
Lukáš66666 Profil |
#2 · Zasláno: 23. 1. 2016, 22:09:17
atbobcz:
A jaký tam posíláš dotaz? |
||
lionel messi Profil |
#3 · Zasláno: 23. 1. 2016, 22:09:34
atbobcz:
Prosím o ukážku SQL dotazu. |
||
atbobcz Profil |
#4 · Zasláno: 23. 1. 2016, 22:21:19
Já jsem tam ten sloupek "salt" vytvořil a všecko funguje jak má. Stáh jsem totiž ten zdroják tady z fóra a tam je ten dotaz na salt. Sice nemám páru proč to tam je a očem to je, ale login na stránky mi funguje.
$sql = 'INSERT INTO uzivatele (`nick`, `heslo`, `salt`, `email`, `ip`) VALUES (\''.$nick.'\', \''.$hash_heslo.'\', \''.$salt.'\', \''.$email.'\', \''.$ip.'\')'; Tím se dostáváme k druhému problému, co tím chtěl básník říci. Párkrát jsem uz sice slyšel o něčem co nazývali "solí" ale nějak jsem myslel že to ješte dlouho potřebovat nebudu. |
||
Lukáš66666 Profil |
atbobcz:
A když v té db nemáš žádný sloupek salt, tak proč tam vkládáš hodnotu do sloupku salt ? " (`nick`, `heslo`, `salt`, `email`, `ip`) "
ps: ale to co asi nazýváš solí se přidává k heslu a je to jeho součástí. $puvodni_heslo = 'samostatneheslo'; $sul_k_heslu = 'd45sa64d65as45sd132vcx5fd46'; $hash_heslo = md5($puvodni_heslo.$sul_k_heslu); Nejsem odborník, ale myslím, že takto by to mělo být. |
||
atbobcz Profil |
#6 · Zasláno: 23. 1. 2016, 22:38:39
Vždiť píšu že jsem to stáhl tady na fóru. Akorát nevím k čemu tam ten "salt" je. Smažu ho až zjistím že je tam na prd. Ale mám silný pocit že ten člověk co to napsal věděl proc ho tam dal.
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="cs" lang="cs"> <head> <meta http-equiv="content-type" content="text/html; charset=UTF-8" /> <title>Registrace</title> </head> <body> <?php /** Vygenerování náhodného řetězce * @param int délka vráceného řetězce * @param int použité znaky: <=10 číslice, <=36 +malá písmena, <=62 +velká písmena * @return string náhodný řetězec * @copyright Jakub Vrána, http://php.vrana.cz/ */ function rand_chars($count = 8, $chars = 36) { $return = ""; for ($i=0; $i < $count; $i++) { $rand = rand(0, $chars - 1); $return .= chr($rand + ($rand < 10 ? ord('0') : ($rand < 36 ? ord('a') - 10 : ord('A') - 36))); } return $return; } //byla odeslana POST data, lepsi nez to tvoje, protoze kontrolovat existenci $_POST pole nemusi vzdy fungovat if($_SERVER["REQUEST_METHOD"] == "POST"){ //kontrola vstupu, nasbirame chyby, pokud jsou if(empty($_POST["nick"])){$chyba[] = "<p class=\"error\"> Vyplň nick.</p>";} if(empty($_POST["heslo"])){$chyba[] = "<p class=\"error\"> Vyplň heslo.</p>";} if(empty($_POST["potvrd_heslo"])){$chyba[] = "<p class=\"error\"> Vyplň \"Potvrd heslo\".</p>";} if($_POST["heslo"] != $_POST["potvrd_heslo"]) {$chyba[] = "<p class=\"error\"> Zadana hesla se neshoduji.</p>";} if(!filter_var($_POST["email"], FILTER_VALIDATE_EMAIL)){$chyba[] = "<p class=\"error\">Pole \"Email\" není platný email.</p>";} //overime, jestli mame chyby ze vstupu, pokud ano, vypiseme je if(is_array($chyba)){ foreach($chyba as $value){ echo $value; } } //vse OK, jdeme zpracovat else{ //pripojeni k databazi $spojeni = mysql_connect("localhost","*********","*********"); if(!$spojeni){ echo "Nepodařilo se připojit k databázi.<br>"; } else{ mysql_select_db("*************"); //vybereme databazi mysql_query("set names 'cp1250'"); //nastaveni kodovani databaze } //osetreni vstupu do databaze proti SQL Injection $nick = mysql_real_escape_string($_POST["nick"]); $heslo = mysql_real_escape_string($_POST["heslo"]); $potvrd_heslo = mysql_real_escape_string($_POST["potvrd_heslo"]); $email = mysql_real_escape_string($_POST["email"]); $ip = mysql_real_escape_string($_SERVER["REMOTE_ADDR"]); $salt = rand_chars(); //vygenerovani nahodneho retezce jako soli $hash_heslo = hash_hmac('sha512',$heslo , $salt); //zahashujeme heslo, muzes si zvolit i jiny pomaly hashovaci algoritmus //zde by bylo vhodne zjistovat, zda uzivatel s touto emailovou adresou jiz neexistuje //vytvoris si SQL dotaz na databazi $sql = 'INSERT INTO uzivatele (`nick`, `heslo`, `salt`, `email`, `ip`) VALUES (\''.$nick.'\', \''.$hash_heslo.'\', \''.$salt.'\', \''.$email.'\', \''.$ip.'\')'; if(mysql_query($sql)){ //Vse ulozeno, presmerujeme na stranku, ze je registrace OK header("Location: http://www.web.cz/registrace.php?registrovano=ok", true, 303); exit; } else{ //nepodarilo ze ulozit data echo "Nepodarilo se ulozit do DB. MySQL chyba " . mysql_errno() . " - " . mysql_error() . "<br>";//jen pro vyvojove prostredi, na ostry web jen hlasku, ze se to nezdarilo } } } ?> <p> <form action="" method="POST"> <!-- pokud posilas formular sam na sebe, hodnota v action muze byt prazdna, pokud chces neco psat, musis osetrovat v htmlspecialchars() jako obrana proti XSS --> <table> <tr><td>Nick: </td><td><input type="text" name="nick" maxlength="50" size="30" value="<?php echo htmlspecialchars($_POST["nick"]);?>" /></td></tr> <!-- veskere vstupy uzivatele na stranku osetruj pres htmlspecialchars, jako obranu pred XSS --> <tr><td>Heslo: </td><td><input type="password" name="heslo" maxlength="50" size="30" /></td></tr> <!-- z bezpecnostich duvodu nevypisujeme znovu heslo--> <tr><td>Potvrď Heslo: </td><td><input type="password" name="potvrd_heslo" maxlength="50" size="30" /></td></tr> <!-- z bezpecnostich duvodu nevypisujeme znovu heslo--> <tr><td>E-mail: </td><td><input type="text" name="email" maxlength="50" size="30" value="<?php if(isset($_POST["email"])){echo htmlspecialchars($_POST["email"]);} else{echo "@";}?>" /></td></tr> <tr><td><input type="submit" name="tlacitko" value="Registrovat" /></td></tr> </table> </form> </p> </body> </html> |
||
Lukáš66666 Profil |
#7 · Zasláno: 23. 1. 2016, 22:42:09
atbobcz:
No ten salt se používá k zabezpečení hesla. Pokud to správně chápu, tak aby heslo které si uložíš do db nešlo prolomit třeba slovníkovým útokem. Uživatel si zadá heslo "mojeheslo". Útočník na stránku bude mít třeba db hashů různých hesel a může obsahovat to heslo "mojeheslo" a tak se snáze dostane na učet toho uživatele, ale pokud za tím heslem bude ta sůl, tak už je nižší pravděpodobnost, že se tam dostane protože ten hash bude jiný. Pokud se mýlím tak ať mě někdo opraví. |
||
lionel messi Profil |
#8 · Zasláno: 23. 1. 2016, 22:45:14
atbobcz:
„Akorát nevím k čemu tam ten "salt" je.“ šifrování hesla Mimochodom, lepiť kódy bez ich znalosti je cesta do programátorských pekiel. |
||
Lukáš66666 Profil |
#9 · Zasláno: 23. 1. 2016, 22:47:28
lionel messi:
Ale trefil jsem se v tom že to slouží k zabezpečení ne? Nemám s tím moc zkušeností. |
||
atbobcz Profil |
#10 · Zasláno: 23. 1. 2016, 22:50:35
No vida a najednou je jasné že "mazání" se nekoná. Pro mě to je a bude ještě hlouho vyšší dívčí. I když rámcové, ale i tak dostačující vysvětlení. Díkes chlape.
|
||
Lukáš66666 Profil |
#11 · Zasláno: 23. 1. 2016, 22:53:25
atbobcz:
A jak to tedy vyřešíš? |
||
CZechBoY Profil |
#12 · Zasláno: 23. 1. 2016, 22:57:02
imho je lepší tu sůl mít v php, protože pokud dojde k odcizení databáze tak má útočník k dispozici i soli => slovníkový útok půjde tak i tak.
|
||
Lukáš66666 Profil |
#13 · Zasláno: 23. 1. 2016, 23:01:32
CZechBoY:
Přesně to si myslím. je lepší mít tu sůl už v php a dát ji k tomu heslo. |
||
Keeehi Profil |
#14 · Zasláno: 24. 1. 2016, 00:18:41
Pokud tomu nerozumíte tak bezpečné to bude jen v případě, že se náhodou trefíte.
Ano, sůl pomůže při vyhledávání proti předpočítané databázi hashů hesel. Problém se solí v PHP je ten, že je stejná pro všechny uživatele. Jako útočník si můžu předpočítat databázi hashů hesel s tou jednou konkrétní solí a jsme tam kde bez soli. Pokud má každý uživatel jinou sůl, tak i pokud mají 2 uživatelé stejné heslo, má každý jiný hash. Použít cokoli jiného než bcrypt se dnes prakticky nepovažuje za bezpečné. bcrypt je navržený naschvál aby byl výpočetně náročný a proto pomalý. Díky tomu by trvalo dlouho než by se na heslo přišlo hrubou silou. bcrypt taky řeší problém ukládání solí. Ta je totiž přímo vložená v jejím výstupu => stačí ti jeden sloupec v databázi Funkce rand_chars používá funkci rand, která prostě není dost dobrá. Bezpečnější bude api.nette.org/2.3.8/source-Utils.Random.php.html#17-79 Kód jsem jen tak prolétl, mohl jsem ještě něco přehlédnout. |
||
Časová prodleva: 9 let
|
0