2012-11-19 34 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