2012-11-19 31 views
1

我正在嘗試創建一個安全的自定義用戶登錄系統,但它目前不起作用。這個想法是用一個安全的,加密的密碼創建一個用戶。但是,使用正確的密碼時,它不會登錄到該網站。爲什麼我的散列/鹽技術存儲密碼不起作用?

$6$j7Rd68RhKNx.6ccH$9lvRDdks.jx4hk7.YQ0hpvzPE22h/BZQ/9yXiwTMBV1Kx2xr2gbIZZJxYjeLrA41nL2WGjmt.FMQi877uOXrP1

相關函數:

// function register_user() 
function bruger_opret_siden(){ 
      if ($stmt = $this->mysqli->prepare('SELECT NULL FROM `bruger` WHERE `brugernavn` = ?')) 
      { 
       $stmt->bind_param('s', $brugernavn); 
       $brugernavn = $_POST["brugernavn"]; 
       $stmt->execute(); 
       $stmt->store_result(); 
       $count = $stmt->num_rows; 
       $stmt->close(); 
       if($count > 0) 
       { 
        $user_found = 1; 
       } 
      } 
      if(!isset($user_found)) 
      { 
       //Check if the user exists. 

       if(!isset($errors)) 
       { 
        $pb = null; 

        include 'function/class.upload.php'; 
        $handle = new Upload($_FILES["file"]); 

        if($handle->uploaded) 
        { 
         //trims to next request   
        } 

       $password = $_POST["pass"]; 
       $algorithm = '$6$'; //<--- This means the SHA 512 
       $salt = $this->generateSalt(16); //<--- SHA 512 uses a 16-character salt 

       $hash = crypt($password, $algorithm . $salt); 

       if ($stmt = $this->mysqli->prepare('INSERT INTO `bruger` 
       (`rank`, `email`, `brugernavn`, `password`, `profilbillede`, `profilbillede_godkendt`, `navn`, `efternavn`, `alder_d`, `alder_m`, `alder_aar`, `status`, `kon`, `seksualitet`, `land_by`, `hojde`) 
       VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)')) 
       { 

        $stmt->bind_param('issssisssssiiisi', $rank, $email, $brugernavn, $password, $profilbillede, $pb_godkendt, $navn, $efternavn, $alder_d, $alder_m, $alder_aar, $kon, $seksualitet, $partnerstatus, $land_by, $hojde); 
        $rank = '1'; 
        $pb_godkendt = '1'; 
        $email = $_POST["email"]; 
        $brugernavn = $_POST["brugernavn"];//C 
        $password = $hash;//C 
        $profilbillede = $pb;//C 
        $navn = $_POST["navn"]; 
        $efternavn = $_POST["efternavn"]; 
        $alder_d = $_POST["alder_d"]; 
        $alder_m = $_POST["alder_m"]; 
        $alder_aar = $_POST["alder_aar"]; 
        $kon = $_POST["kon"]; 
        $seksualitet = $_POST["seksualitet"]; 
        $partnerstatus = $_POST["partnerstatus"]; 
        $land_by = $_POST["land_by"]; 
        $hojde = $_POST["hojde"]; 

        $stmt->execute(); 
        $stmt->close(); 

        echo "ok"; 

        } 
        else 
        { 
         // There was an error 
         echo 'error: ' . $mysqli->error; 
        } 
       } 
      } 
      else 
      { 
       echo "<li id=\"check_not\">Dette brugernavn er optaget!!</li>"; 
      } 
    } 

代碼,以使從所述密碼和鹽散列來註冊用戶:

function generateSalt($length) { 
     $alphabet = './ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'; 
     $alphabet_length = strlen($alphabet); 
     $salt = ''; 
     for ($i = 0; $i < $length; $i++) { 
      $salt .= $alphabet[rand(0, $alphabet_length - 1)]; 
     } 
     return $salt; 
    } 
使用密碼 123456789jp

輸出

兩個函數來顯示你sers信息。

$pass = $mebe->generateSalt(); 
       $users = $mebe->bruger_opret_siden(); 

以下函數包含該問題;它不會登錄用戶。雖然沒有產生錯誤,但它不起作用。因爲我不能完全掌握你的代碼由於語言差異

<?php 
    /* 
    * // Grant the administrative privilige to show the content. 
    * Giver admin adgang til se indhold på siden. 
    */ 
    if(isset($_SESSION["rank"]) && $_SESSION["rank"] > 0) { 
     $bruger = $mebe->brugerindhold_side(); 
    } 


    /* 
    * // Grant normal access to the page. 
    * Hvis ingen af dem så få de bare adgang sådan her.. 
    */ 
    else{ 
    ?> 
<form name="login" method="post" action="#"> 
    <h1>Log ind</h1> 
    <p>Brugernavn</p><input type="text" name="brugernavn"/> 
    <p>Password</p><input type="password" name="pass"/> 
    <br /> 
    <input type="submit" name="Log_ind" value="Log ind" id="login"> 
    <?php 
    if(isset($_POST["Log_ind"])) 
    { 
    $login = $mebe->godkendt_login(); 
    } 
    ?> 
</form> 
<?php 
    } 
?> 

回答

2

好了,:

function godkendt_login() 
    { 
     if ($stmt = $this->mysqli->prepare("SELECT `id`, `brugernavn`, `rank`, `profilbillede`, `profilbillede_godkendt` FROM `bruger` WHERE `brugernavn` = ? AND `password` = ?")) 
     { 
      $stmt->bind_param('ss', $brugernavn, $password); 
      $brugernavn = $_POST["brugernavn"]; 
      $password = sha1($_POST["pass"]); 
      $stmt->execute(); 
      $stmt->store_result(); 
      $stmt->bind_result($id, $brugernavn, $rank, $profilbillede, $profilbillede_godkendt); 
      $stmt->fetch(); 
      $count = $stmt->num_rows; 
      $stmt->close(); 

      if($count > 0) 
      { 
       $_SESSION["logged_in"] = true; 
       $_SESSION["id"] = $id; 
       $_SESSION["profilbillede"] = $profilbillede; 
       $_SESSION["brugernavn"] = $brugernavn; 
       $_SESSION["rank"] = $rank; 
       $_SESSION["profilbillede_godkendt"] = $profilbillede_godkendt; 

       if($_SESSION["logged_in"] == true) 
       { 
        echo "ok"; 
       } 
       else 
       { 
        // Sorry, please try again. 
            echo "Desværre prøve igen." 
       } 
      } 
      else 
      { 
          echo "Skrive et password eller brugernavn" 
      } 
     } 
    } 

日誌文件/文件INC。 鹽應該是可重現的值。從我收集你的東西似乎隨機產生。

如果是這樣,哈希將不會加起來,因此檢查失敗。 對散列使用一個常量值,並且不要將其存儲在數據庫中

例如:

<?php 

    function generateHash($in) 
    { 
     $salt = "Th1s1sAS4lt"; 
     return md5(sha1($in) . $salt); 
    } 
?> 

此外,任何後值應,因爲它是由用戶輸入的,並且可以包含非法字符或有害代碼檢查。注意以下事項:

<?php 
    // Note that the input contains SQL. 
    // bemærke, at de input indeholder SQL.     
    $_POST['passwd'] = "'[email protected]' OR 'a' = 'a'"; 

    if (tilmeld_dig()) 
    { 
     // Log the user in. 
     // brugeren er logget på 
    } 


    function tilmeld_dig() 
    { 
     $sql = "SELECT brugernavn from tbl_brugere WHERE adgangskode = " . $_POST['passwd']; 

      // Execute the database command. 
     $res// = Database kommando udføre 
     if ($res) 
     { 
      return true; 
     } 
     else 
     { 
      return false; 
     } 
    } 
?> 

在上面的例子中,用戶在無論登錄密碼,因爲注入SQL命令,將始終是真實的。

雖然這是一個最原始的例子,請參閱本: http://translate.google.com/translate?hl=nl&sl=en&tl=da&prev=_dd&u=http%3A%2F%2Fwww.unixwiz.net%2Ftechtips%2Fsql-injection.html

我想支持你一些丹麥評論,因爲這是安全系統的重要。你在正確的軌道上,但我建議你看看我的建議。

此外,這是未經測試的代碼,但它或多或少是如何工作的。

+0

它的工作原理是更簡單的方法:) –

+0

現在你的問題解決了嗎?這似乎是**代碼的問題,但我不確定它是否解決了您的問題。 – Digitalis

+0

另外,我懷疑你會守護關於外星人生活的信息,因爲那是一個密碼! ;) – Digitalis