2010-06-28 174 views
1

更確切地說: 我想檢查用戶是否輸入了與DB中的一個商店相同的密碼作爲其配置文件。我試過類似的東西,但我沒有得到迴音:是否有可能檢查MD5密碼

$query2=mysql_query("SELECT emails_password,emails_id FROM lala.in_emails WHERE emails_password ='md5($password)' AND emails_id='".$_COOKIE['LALA_ID']."'")or die(mysql_error()); 
if(mysql_num_rows($query2)>0){echo "same pass";} 

所以也許md5算法總是變化?

回答

6

應該刪除md5($ password)附近的那些單引號(')。不,MD5哈希不會改變。

+0

是的正確,在這裏犯了一個錯誤..感謝 – tetris 2010-06-28 06:15:30

+1

...但增加了'$ password'' – 2010-06-28 06:17:21

+0

''md5'($ password)''=>'md5('$ password')',但你應該散列在PHP中的密碼不在SQL中:如果出現問題,明文密碼將不會在MySQL轉儲中。請參閱@Babiker答案。 – 2010-06-28 06:18:54

4

呼應,以確保所有瓦爾被填充檢查查詢字符串:

echo "SELECT emails_password, emails_id FROM lala.in_emails WHERE emails_password ='".md5($password)."' AND emails_id='".$_COOKIE['LALA_ID']."'"; 

你應得到的東西

SELECT emails_password,emails_id FROM lala.in_emails WHERE emails_password ='098f6bcd4621d373cade4e832627b4f6'AND emails_id ='some-emails-id'

2

你的問題是與MySQL語法相關,而不是與哈希相關。
好會的做法是這樣的:

$password = md5($password.$global_salt.$_COOKIE['LALA_ID']); 
$password = mysql_real_escape_string($password); 
$lala_id = mysql_real_escape_string($_COOKIE['LALA_ID']); 
$query = "SELECT emails_password,emails_id FROM lala.in_emails 
      WHERE emails_password ='$password' 
       AND emails_id='$lala_id'"; 
$result = mysql_query($query) or trigger_error(mysql_error().$query); 
if(mysql_num_rows($result)>0){echo "same pass";} 

感謝斯特凡和伊姆雷L用他們的偉大的意見,使這個代碼更好

附錄: 人們在評論指責我使用轉義的MD5 ()函數結果。
我覺得這是爲未來的讀者解釋的好點:

如果您想到每個特定變量的數據源 - 您正在混合圖層。
MD5()不做任何「消毒」。這只是一個巧合,它的結果不包含特殊字符。 但是一個人不應該想到這一點!
數據庫層應該獨立於上下文。它必須是完全抽象的。不管你如何驗證你的數據 - MD5,只有拉丁字母,數字等 - 所有這些與數據庫層無關。 DB層應該知道數據源和表單的註釋。它應該只是執行正確語法的SQL的職責。有一天,驗證規則可能會更改 - 對於普通密碼,或者某些二進制格式可能包含空字節等。驗證規則可能會更改,但數據庫規則必須保持不變。

以準備好的語句爲例:
您是否決定每個變量,它是否需要綁定?不,你無條件地做,無論它是什麼形式。所以,引號中的數據轉義應該是。

+3

現在這就是我所說的偏執狂,'mysql_real_escaping'一個MD5散列。 ;) – deceze 2010-06-28 06:33:27

+2

@deceze我分享你的幽默:)但嚴重:密碼存儲形式可能會改變。轉義字符串必須是嚴格的規則,沒有例外。你不要調用綁定相同的散列佔位符偏執? – 2010-06-28 06:38:45

+0

沒有什麼可以在散列中轉義。 使用鹽很好。如果你想做得更好,那麼你使用hmac和比md5更好的東西:'hash_hmac('ripemd160',$ password,'secretgolobalsalt');' – 2010-06-28 22:08:59

0

1)使用mysql_real_escape_string()轉義$ _COOKIE ['LALA_ID']以防止SQL注入。

2)使用散列的強大的版本,像SHA512

3)如果你是這麼認爲有關保護客戶一般密碼,那麼你可以在客戶端哈希密碼,併發送哈希服務器。在服務器上再次散列它。

+0

散列在客戶端是壞的,你可以然後簡單地發送散列(在妥協數據庫後) – knittl 2010-06-28 08:19:00

+0

散列在客戶端防止通過網絡發送明文密碼如果您不使用https – codez 2010-06-29 10:07:44

相關問題