2012-08-02 72 views
3

我有存儲密碼這樣的數據庫字段:如何在文本框與密碼數據庫行匹配字符串

TeacherPassword 

j.lu01 
pesci02 
cricket01 

現在我有當用戶在密碼輸入的文本框,如果它有一個相匹配然後導航到下一頁。以下是它檢查密碼的代碼。

$teacherpassword = (isset($_POST['teacherpassword'])) ? $_POST['teacherpassword'] : ''; 

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

    // don't use $mysqli->prepare here 
    $query = "SELECT * FROM Teacher WHERE TeacherPassword = ? LIMIT 1"; 
    // prepare query 
    $stmt=$mysqli->prepare($query); 
    // You only need to call bind_param once 
    $stmt->bind_param("s",$teacherpassword); 
    // execute query 
    $stmt->execute(); 
    // get result and assign variables (prefix with db) 
    $stmt->bind_result($dbTeacherPassword); 

但我所做的是,我已經更新了密碼字段,以便該字段不顯示passwrod作爲一個字符串,而是一串字符,這樣他們的密碼是安全的。下面是更新我做:

UPDATE Teacher 
SET TeacherPassword = Password(TeacherPassword); 

這將導致密碼字段看起來像現在這樣:

TeacherPassword 

    *6FF132E0666AC8462BC 
    *FCF5F8CE105D0748315 
    *FD4FA4B60EEF1E24050 

所以我的問題是什麼,在我的mysqli碼,我如何得到字符串密碼輸入文本框j.lu01以匹配其在數據庫行中的散列密碼*6FF132E0666AC8462BC

回答

1

您的密碼字段被限制爲20個字符,這樣你哈希密碼已經被修剪到長度,請嘗試:

SELECT * FROM Teacher WHERE TeacherPassword = LEFT(Password(?),20) 

但是:

  1. 密碼是爲MySQL的內部使用,你應該真的使用SHA1代替
  2. 你應該真的調整你的密碼字段(如果你仍然有非編碼值)。
  3. 你應該考慮使用「salting」你的密碼和一個隨機字符串(比如說6個字符)作爲密碼的前綴,這樣2個相同的密碼的編碼方式會有所不同。

對於以後,你需要添加一個salt列到你的表,並用一些隨機字符串填充它。

然後,你可以使用編碼:

UPDATE Teacher SET TeacherPassword = SHA1(salt @password) 

SELECT * FROM Teacher WHERE TeacherPassword = SHA1(salt @password) 

一個不錯的最終的解決方案可能是:

ALTER TABLE Teacher CHANGE TeacherPassword TeacherPasswordOld VarChar(20) 
ALTER TABLE Teacher ADD TeacherPassword VarChar(40) 
ALTER TABLE Teacher ADD Salt VarChar(40) 

對於UDPATE通2個值:@salt和@Password

Update Teacher SET [email protected], Password=SHA1(Salt @password) 

凡鹽ca n爲產生這樣的PHP:

$salt = ""; 
for ($i = 0; $i < 40; $i++) { 
    $salt .= substr(
    "./ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz", 
    mt_rand(0, 63), 
    1); 
} 

爲了檢查密碼,則可以使用

SELECT * from Teacher 
-- if no "new" password, check the old one 
WHERE TeacherPassword is null and TeacherPasswordOld=LEFT(Password(@password),20)) 
-- else check the new pass 
    OR TeacherPassword = Sha1(salt @password) 

鹽生成採取Here

+0

因此,如果我在表中添加一個鹽列,讓我說我有3行,我在「鹽」列下填充3行?我是否輸入任何隨機字符串?你能舉個例子嗎? – user1394925 2012-08-08 02:05:12

+0

鹽需要隨機生成,我更新了我的答案請看看 – 2012-08-08 07:04:19

1

查詢只需更改爲:

SELECT * FROM Teacher WHERE TeacherPassword = Password(?) LIMIT 1 
+0

我在,但它不jlu.01'密碼輸入'看起來不接受它,這是當我嘗試你的代碼 – user1394925 2012-08-02 22:03:53

+0

在MySQL中運行以下「選擇密碼('jlu_01')」,看看你得到的是什麼是存儲在數據庫中。可能是數據庫中的值在更新之前有空白,或者從文本框中讀取的值有空白。 – 2012-08-02 22:10:20

+0

@ A.J。我已經完成了select語句,它工作正常,它能夠找到jlu_01的哈希密碼,它似乎沒有在mysqli SELECT和WHERE子句中工作 – user1394925 2012-08-02 22:14:08

6

,如果是這樣的話,那麼你需要在數據庫中搜索之前,首先hash密碼。和我試着sqlfiddle運行,併產生不同的散列值

Password('j.lu01') => *7A48257211A5C6BF45C30374789E9027726D829D 
Password('jlu_01') => *FCF5F8CE105D0748315591596E8A4F87A2E12B1A 

-- your password field is truncated that's why it can't find the match also 
-- alter TeacherPassword field and change it's length to 42 

能否請您檢查您的TeacherPassword字段長度的方式嗎?

SQLFiddle

+0

我將長度更改爲42,但登錄仍然無效。在TeacherPassword字段中,它仍然顯示這個'* FCF5F8CE105D0748315' – user1394925 2012-08-02 23:10:02

+1

@ user1394925當我在我的服務器上嘗試輸入'Password('jlu_01')'是'* FCF5F8CE105D0748315591596E8A4F87A2E12B1A'時,那麼爲什麼你的只是'* FCF5F8CE105D0748315' ?剩餘的'591596E8A4F87A2E12B1A'在哪裏? – 2012-08-06 12:48:00

0

你可以寫你的查詢象下面這樣: -

SELECT * FROM Teacher_Table WHERE HEX(t_password)=HEX('Your_Password') LIMIT 1; 

使用HEX(), MD5()了更好的安全性。這個查詢是在MySQL上測試的。

如果不使用以上功能: -

SELECT * FROM Teacher_Table WHERE t_password='Your_Password' LIMIT 1; 

您也可以使用PASSWORD()在上述提到的answer.There是讓你的查詢檢索安全時,許多其他的方法。

建議使用上述功能避免黑客入侵。