2009-07-01 46 views
0

我正在設置一個cookie。例如:查詢MySQL中的SHA salt

$_COOKIE['test'] = SHA1('124'.'mysalt'); 

現在124是我的id我想要的。所以在我的MySQL表中,我試圖運行如下查詢:

$sql = ("SELECT * FROM users WHERE SHA1(`id`) = '".mysql_real_escape_string($_COOKIE['test'])."'"); 

如何將「mysalt」添加到SQL查詢中?因爲否則我想要得到正確的ID。

回答

4

使用可以使用Concat()了點。

SELECT ... Sha1(Concat(`id`, 'mysalt'))=... 
+0

請記住:MySQL不能使用索引來加快在這種情況下,搜索。向表中添加另一個字段可能會更好,因此您可以查詢類似SELECT ... WHERE id = 124和tempkey ='87gesafouvgbaesofiuigsaf' – VolkerK 2009-07-01 08:20:55

1

查詢應該是:

$sql = ("SELECT * FROM users WHERE SHA1(CONCAT(`id`,`mysalt`)) = '".mysql_real_escape_string($_COOKIE['test'])."'"); 

如果我理解你正在試圖做正確的。

+0

沒有檢查新答案,但我花了太長時間回答,我的錯誤。 – Roberto 2009-07-01 08:16:38

+1

這樣做是醜陋的,並會表演崩潰的`users`表將增長,因爲MySQL將不得不計算`SHA1(CONCAT(「身份證」,「mysalt」))`每次執行請求的時間。考慮添加包含`SHA1(CONCAT( '身份證', 'mysalt'))`新列`id_hash`,指數,並把你的請求過濾的`id_hash = mysql_real_escape_string($ _ COOKIE [ '測試'])` – MaxAuray 2015-09-15 08:46:47

0

使用CONCAT:

$sql = ("SELECT * FROM users WHERE SHA1(CONCAT(`id`,'mysalt')) = '".mysql_real_escape_string($_COOKIE[''test''])."'"); 
1

可能已經提供的解決方案將工作得很好,但是你一定要做到這一點?如果字段「id」確實是一個明確的標識,那麼可以使用「LIMIT 1」來停止mysql搜索所有項目。另一件事是,爲什麼你不使用一個單獨的預先計算的領域呢?我的意思是在每個查詢中,mysql不必要地計算所有這些sha1值。最後一件事。我不確定你爲什麼使用你的方法,但我最好的猜測是實現某種會話密鑰。我認爲這是一個壞主意,原因有兩個:如果有人拿到你的鹽,他可以訪問你的所有賬戶。如果有人嗅探一個「會話」,他可以隨時重用。選擇弱鹽會產生嚴重的後果。 HTH。