Autor Zpráva
atbobcz
Profil
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
atbobcz:
A jaký tam posíláš dotaz?
lionel messi
Profil
atbobcz:
Prosím o ukážku SQL dotazu.
atbobcz
Profil
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
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
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
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
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
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
atbobcz:
A jak to tedy vyřešíš?
CZechBoY
Profil
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
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
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.

Vaše odpověď


Prosím používejte diakritiku a interpunkci.

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