2011-04-11 54 views
0

我有一個簡單的消息傳遞系統。在PHP中編碼,MySQL和Java可能會實現。現在我想確保收件人的ID。目前我使用用戶表的自動增量主鍵(1,2,3)。但這當然是不安全的。因爲每個人都可以猜測,所有其他ID都從1到xxx計數。那麼確保身份證的最佳商業實踐是什麼?在MD5中轉換它(也許用一些密碼文本「myencryptionkey」+ userId - > MD5)? 如果收件人ID很容易重現,垃圾郵件發送者將使用此係統用於他們的目的。BBP:如何在郵件系統中保護數據庫ID?

我認爲這是一個普遍的問題。以及「友誼邀請」。如果每個人都能猜到,如何構建ID,則可以發送大量的友誼邀請。

另一個想法: 什麼是關於用隨機創建的密鑰加密userIds。我生成一個隨機密鑰,將它存儲在會話cookie中。所以每個人都有一個用戶123的其他標識符。所以我需要一個函數來加密和解密一個給定的整數。

如何像Facebook PROTEC其主鍵的網頁?

回答

0

我只看到了問題,如果你的系統有漏洞,讓人們利用你的標識符,雖然我理解的關注,它已經跨越了我的腦海裏偶爾,爲此我可能會建議,雖然不一定是的支持者,對每個唯一密鑰使用GUID

這些可以是自動生成的上的記錄插入,和消除可猜測因子。

他們還擴大了規模相當顯著,我會說,相較於一個整數 - 這是有問題的依賴於規模和系統的其他領域。

+0

用GUID表示PHP函數:** uniqid()**? – brill 2011-04-11 12:10:05

+0

當然,MySQL支持在字段上自動生成GUID作爲標識,你不需要自己生成和插入這些GUID。 – 2011-04-11 12:14:39

+0

使用GUID時,請將GUID => ID映射保留在單獨的表中,並使用數字ID保留在所有其他表中。這可以確保只有最小的性能損失(查找GUID => ID的時間),而不必在每次訪問混淆主鍵時都要執行基於字符串的查找。 – ThiefMaster 2011-04-11 12:50:26

1

ID通常是可預測的。這不是問題。

,使它們不預測的本質,你做的ID的祕密。無論誰知道祕密都可以訪問。這被稱爲security by obscurity,並且在所有處都不是安全的

如果你想限制訪問,你應該把一些訪問控制措施到位。例如,讓用戶根據其userId /角色登錄並提供查看權限。

+0

你說得對。我將阻止該用戶將消息寫入其他用途,這些用戶不在好友列表中。所以如果有人操縱接收者ID,消息將不會被髮送。 Bacuase被操縱的userid不是一種freindship關係,好的。但是邀請是什麼?當然,非常可以向任何人發送友誼邀請。也許消息傳遞試驗不是最好的。如何防止垃圾郵件發送者/黑客可以猜測ID併發送大量邀請?在我看來,這可以通過加密ID來完成。 – brill 2011-04-11 13:15:16

+0

@brill 然後,我會建議只添加到常規的數字ID和用戶的名字(僅用於鏈接到他們的個人資料),如'example.com/profile/123slava'。你不會通過加密使它更安全,你只會失去表現。用戶的名字/姓氏將是普通主鍵的密碼,對普通用戶來說最不方便,而且在處理混淆的ID時不會出現性能損失。 – Slava 2011-04-11 13:26:10