2013-05-05 109 views
0

我工作的一個玩具網站,我已經實現了給予好評按鈕,有一個onclick屬性是這樣的:如何設計網站的用戶ID?

Dajaxice.debater.upvote(
    upvote_js,//Don't worry about this, it's just dealing with AJAX 
    { 
     'username' : 'bob',//bob is the user being upvoted by 
    } 
) 

你看到的問題是網頁直接使用用戶名,它是壞的設計,因爲用戶可以輕鬆地打開一個Chrome控制檯,更改用戶名並僞造一個請求說愛麗絲而不是鮑勃。我調查了幾個網站,看到他們正在使用長字符串看起來像哈希代表用戶。我想知道這通常是如何實現的?在更一般的形式,我在尋找一種算法:

  1. 給出一個唯一的ID爲每個用戶
  2. 即使這個ID被賦予暴露於用戶或任何第三方,他們將不知道哪個用戶這個id表示沒有使用很長時間或很多內存來計算(反轉哈希)。
+0

服務器如何實施?你在使用框架嗎? – Aya 2013-05-05 10:31:03

+0

@Aya我正在使用django – dorafmon 2013-05-05 10:31:35

+0

你在使用Django的[內置身份驗證框架](https://docs.djangoproject.com/en/dev/topics/auth/)嗎? – Aya 2013-05-05 10:33:30

回答

2

您可以生成一個加密形式的字符串(根據定義,散列是不可逆的)。

這樣做的缺點是,如果某人擁有所有用戶的列表,他們就可以計算出您使用的算法並打敗您的加密。

一種常見的方式做可逆加密base64

>>> import base64 
>>> secret = base64.b64encode('bob') 
>>> secret 
'Ym9i' 
>>> print base64.b64decode('Ym9i') 
bob 
1

聽起來更像是這是一個設計問題,而不是編碼問題。

即使您以某種方式散列用戶名,總會有辦法通過在網頁上找到該散列的實例來獲取散列。

您可以實現一個系統,使每個用戶只能維護一次用戶一次,但沒有什麼可以阻止某人創建多個帳戶來繞過限制。

一個常見的解決方案是跟蹤哪些IP地址已經爲特定用戶上線,並禁止來自同一個IP地址的同一用戶的多個upvotes。