2016-03-01 82 views
1

我創建了一個系統,允許管理員使用電子郵件地址和密碼註冊另一個管理員以登錄到受保護區域。一個管理員通過這種形式註冊:爲什麼我的登錄系統無法正常工作?

<form action="adduser.php" method="POST"> 
      <label for="emailaddress">Email Address: </label><input type="text" name="emailaddress" /> 
      <label for="password">Password: </label><input type="password" name="password" /> 
      <label for="name">Name: </label><input type="text" name="name"/> 
      <input type="submit" value="Submit" name="submit"/> 
</form> 

的adduser.php看起來是這樣的:

<?php 
    require'databaselogin.php'; 
    if(isset($_POST['emailaddress'],$_POST['password'],$_POST['name'])){ 
     $result= $pdo->prepare('INSERT INTO users (emailaddress, password, name) 
          VALUES(:emailaddress, :password, :name)'); 
     $hash = password_hash($_POST['password'], PASSWORD_DEFAULT); 
     unset($_POST['submit']); 
     $_POST['password'] = $hash; 
     $result->execute($_POST); 
     header("Location:admin.php"); 
    } 
?> 

到這裏似乎工作表叫用戶,那麼被填充數據。我猜可能它可能使用$ hash不正確,比在表中存儲的密碼不是用戶在密碼字段中輸入的內容?

當用戶嘗試登錄使用這種形式:

<form action="login.php" method="POST" > 
       <label for="emailaddress">Email Address:</label><input type="text" name="emailaddress"/> 
       <label for="password">Password:</label><input type="password" name="password"/> 
       <input type="submit" value="Go" name="submit"/> 
      </form> 

鏈接到這個PHP:

<?php 
    session_start(); 

     require'databaselogin.php'; 
      $stmt = $pdo->prepare('SELECT * FROM users WHERE emailaddress = :emailaddress'); 
      if(isset($_POST['submit'])){ 
      $criteria = [ 
      'emailaddress' => $_POST['emailaddress'], 
      ]; 
      $stmt->execute($criteria); 

      $user = $stmt->fetch(); 
      var_dump($user); 
      if (password_verify($_POST['password'], $user['password'])) { 
       $_SESSION['loggedin'] = $user['id']; 
       header("Location:admin.php"); 
      } 
      else { 
       header("Location:index.php"); 
      } 
      } 
?> 

正確的電子郵件和密碼輸入到從網站上註冊剛剛重裝上index.php,而不是把它們帶到admin.php。我真的無法理解這個問題,因爲代碼看起來聽起來太我我猜這是一個問題,無論$ hash實際上保存到密碼字段。

如果有人可以幫助這個,它會非常感激!

+0

這個怎麼樣,註冊1234的簡單密碼的用戶,並檢查你的表存儲的哈希值。然後使用相同的方法回顯散列1234,查看字符串是否匹配。如果他們這樣做,這個問題與散列無關。 – Abdel

+4

和,密碼欄的長度是多少?如果它太短,那麼*無聲無息*。 –

+1

'var_dump($ user)'的結果是什麼? –

回答

3

由於您沒有回覆評論,我提交了以下內容。

我懷疑你的密碼欄的長度太短。

如果是這種情況,則需要將其設置爲60+。因此,修改你的列,清除你的密碼行中包含散列,創建一個新的散列,然後再試一次。

關於這方面的手冊:

PASSWORD_DEFAULT - 使用bcrypt算法(默認爲PHP 5.5.0的)。請注意,隨着新的更強大的算法添加到PHP中,此常量將隨時間而改變。出於這個原因,使用這個標識符的結果的長度會隨着時間而改變。因此,建議將結果存儲在可擴展超過60個字符的數據庫列中(255個字符將是一個不錯的選擇)。如果太短

  • 的MySQL 將失敗默默。我以前見過很多次。

上的補充說明:

這是最好每頭之後使用exit;,否則你的代碼可能要繼續執行。

if (password_verify($_POST['password'], $user['password'])) { 
    $_SESSION['loggedin'] = $user['id']; 
    header("Location:admin.php"); 
    exit; 
} 
else { 
    header("Location:index.php"); 
    exit; 
} 
+0

奧特金斯請檢查他說什麼。他是對的 –