2012-02-14 77 views
0

注意比較:PHP - 哈希使用數據庫無法正常工作

  • 我還是相當新的PHP
  • 此登錄表單似乎完全正常工作,如果我不散列密碼。
  • 我試過md5,sha256,現在我已經把它留在sha1。這些都不起作用。
  • 我第一次使用echo sha1("password");來找出我的密碼的散列值是什麼,然後我複製這個散列值並用phpMyAdmin手動粘貼它。我不確定這是否是問題所在。

反正這裏是代碼:

<?php 
session_start(); 
require("config.php"); 

if(isset($_POST['submit'])) { 

    $username = mysql_real_escape_string($_POST['username']); 
    $password = sha1(mysql_real_escape_string($_POST['password'])); 

    $loginsql = "SELECT * FROM login WHERE username = '" . $username . 
    "' AND password = '" . $password . "'"; 
    $loginresult = mysql_query($loginsql); 
    $loginnumrows = mysql_num_rows($loginresult); 

    if($loginnumrows == 1) { 
     $loginrow = mysql_fetch_assoc($loginresult); 
     session_register("USERNAME"); 
     session_register("USERID"); 

     $_SESSION['USERNAME'] = $loginrow['username']; 
     $_SESSION['USERID'] = $loginrow['id']; 

     header("Location: " . $config_basedir . "controlpanel.php"); 
    } 
    else{ 
     echo "<p>Incorrect Login, please try again!</p>"; 
    } 
} 
else{ 

} 
?> 

我真的不太知道在哪裏這個去。我確定我的代碼可能更高效,但正如我在筆記中提到的那樣,當我不散列密碼時它確實有效。謝謝你的閱讀。

+1

如何在您的數據庫中設置'password'? – 2012-02-14 22:02:35

+1

在數據發送到數據庫之前,您不應該使用'mysql_real_escape_string'。具體來說,'sha1(mysql_real_escape_string($ _ POST ['password']));'應該是'mysql_real_escape_string(sha1($ _ POST ['password']));'。我們也無法看到*存儲的密碼是如何散列的,所以我們無法真正幫助你。嘗試選擇記錄和'var_dump'你的密碼。將它與發佈到服務器的值進行比較。這些是您應該學會遵循的基本調試步驟。 – meagar 2012-02-14 22:03:01

+1

你試過'$ password = sha1($ _ POST ['password']);'?這裏不需要mysql_real_escape_string。 – aletzo 2012-02-14 22:03:23

回答

1

如果它沒有散列密碼,它聽起來像你的密碼存儲在數據庫中的明文 - 這將是我會檢查的地方。

可能發生的另一件事是mysql_real_escape字符串應該用在sha1的另一邊,所以它不會干擾確切的輸入。

所以它應該是:mysql_real_escape_string(sha1($_POST['password'])); 這可能會改變一些事情。

注:雖然SHA1目前還沒有任何已知的安全問題,所以它應該安全地直接放入數據庫,而MySQL的逃避,有人曾經告訴我,始終確保一切進入數據庫應只是爲了防止在sha1或md5中發現安全漏洞而被施放或轉義。

+0

這是我認爲可能是問題,但我不知道如何改變這一點。 – finec 2012-02-14 22:06:43

+0

我相信他們的意思是,它們在兩個地方都沒有散列密碼的情況下起作用。 (意思是在db和明文查找中的明文) – 2012-02-14 22:07:01

+0

對不起,我錯過了您複製了sha1並將其放入數據庫中。 我會在通過sha1之後嘗試'echo $ password;',然後獲取結果並將其插入數據庫並查看它是否有效。 – 2012-02-14 22:10:21

4

如果您的密碼包含任何'或其他可逃避字符,則這不起作用。

$password = sha1(mysql_real_escape_string($_POST['password'])); 

你應該散列先,然後逃逸:

$password = mysql_real_escape_string(sha1($_POST['password'])); 

而作爲一個SHA1只包含[a-f0-9],你可以也跳過escpaing

$password = sha1($_POST['password']); 
+0

我同意這是最好的答案。我注意到他在逃跑後哈希了。 – LF4 2012-02-14 22:11:12

+0

我忘了提及它,但我已經試過這個,它不能解決我的問題。不過謝謝。 – finec 2012-02-14 22:14:09

1

看來您的密碼在數據庫不會被散列,你需要改變它和你的註冊表單,這樣所有的數據庫都使用相同的散列方法。

您可以使用MySQL SHA1()函數更改數據庫中的所有密碼。

0

轉義的密碼與輸入的密碼不一樣。該不會包含任何特殊字符。

abc'sha1!= escaped abc \'sha1