2012-07-26 107 views
2

在將值插入到SQL查詢之前,在值上使用了一個散列值可以防止sql注入,甚至不需要使用mysql_real_escape_string? (假設你要爲你的整個網站做這個)加密是否防止sql注入?

編輯:具體目的是從用戶那裏獲取一個密鑰,並在將它與其他表中的哈希列進行比較之前進行哈希處理,然後檢索另一列哈希匹配的值。對不起,沒有指定

+1

散列值與散列值相比有什麼價值?整個輸入的哈希相比什麼?我的意思是,你無法取回它,因爲*它是一個散列* – Alfabravo 2012-07-26 17:28:48

+0

你的意思是例如:select * from table where'[hash data]'='A';? – hmmftg 2012-07-26 17:31:08

+2

請花點時間瞭解[散列和加密之間的區別](http://stackoverflow.com/questions/4948322/fundamental-difference-between-hashing-and-encryption-algorithms)。 – 2012-07-26 17:35:16

回答

9

是的,但它也會使你的數據無用。 :P請記住,散列是單向的,所以你不能獲得有意義的數據。加密是兩種方式,這可能就是你的意思。

我認爲使用準備好的SQL語句是這種事情更廣泛接受的解決方案。見this question

+0

從來不知道這個,對這個問題有很多見解,謝謝! – imkendal 2012-07-26 17:50:39

+0

@kjh請注意,加密會創建二進制數據,您無法將其存儲在傳統的「字符」字段中。這也是我推薦使用編碼(例如:base64)而不是加密(例如:AES)的原因。 – Palladium 2012-07-26 17:58:04

1

只要你的哈希輸出在mysql中沒有任何衝突的字符,那麼我肯定會說是的。 base64是做這種事的好方法

0

如果你正在考慮md5()或sha1(),你永遠無法解密散列。如果你有自己的加密算法,我會說去做。

3

是的,但是一旦散列了信息,就不能從散列中重新生成信息。改爲使用編碼方法。

此外,mysql_ *功能(或即將)不推薦使用。您應該考慮切換到mysqliPDO。如果你是一個懶惰的屁股(像我一樣),你可以使用mysqli程序風格,它幾乎與原來的mysql_函數相同。

+0

有趣我甚至從來沒有玩過msqli功能。感謝您的提示 – imkendal 2012-07-26 17:46:33

0

在我看來,我認爲你應該使用他們兩個,這裏有一個例子:

$em = mysql_real_escape_string($_REQUEST['email']); 
$pw = mysql_real_escape_string($_REQUEST['password']); 
at the insert you use the password($pw) function. 
1

是的,但只有當你存儲密鑰進行加密並作爲哈希。我剛剛完成了一個tcl腳本。主要程序應該可以幫助你。 採取純文本密鑰和散列,也加密這個純文本密鑰,並存儲在您保存(也加密)的表格數據相同的行。

通過將密鑰列解密並插入框中,填充下拉列表或任何使用純文本密鑰的內容。現在您可以選擇純文本鍵進行搜索。

這需要一個加密,解密和哈希路由,每次你想要添加,更新,刪除記錄或顯示記錄時被調用,但我注意到沒有減慢,但我確信它存在於微秒級別。

請確保您的加密來自標準化和受尊重的來源,如openssl或類似的,所以你可以用自動填充和自動IV創建cbc。這種方式就像數據庫中的單詞被加密的方式不同。這也是爲什麼你需要散列密鑰。否則它會以不同的方式進行加密,而且你無法搜索任何東西。

通過這種方式,密鑰被散列並與其他哈希值進行檢查。嘗試在一個字段中插入惡意的單詞組,並且可能發生的麥芽汁被散列成非危險的單詞。

如果使用tcl,它也有助於使用大括號來防止問題開始