如何设计网站的用户ID?

时间:2013-05-05 10:28:27

标签: python html django algorithm web

我正在一个玩具网站上工作,我已经实现了一个upvote按钮,其中有一个onclick属性:

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控制台,更改用户名并假冒upvote说alice而不是bob的请求。我调查了几个网站,看到他们使用长字符串看起来像哈希代表用户。我想知道这通常如何实施?在更一般的形式中,我正在寻找一种算法:

  1. 为每个用户提供唯一ID
  2. 即使这个id暴露给用户或任何第三方,他们也不知道这个id所代表的用户,而不需要花费很长时间或大量内存来计算(反向哈希)。

2 个答案:

答案 0 :(得分:2)

您可以生成字符串的加密形式(根据定义,散列不可逆)。

缺点是,如果有人拥有所有用户的列表,他们就可以计算您使用的算法并破坏加密。

执行可逆加密的常用方法是使用base64

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

答案 1 :(得分:1)

听起来更像是一个设计问题,而不是编码问题。

即使您以某种方式对用户名进行了哈希处理,也总会有办法通过在某个网页上找到该哈希的实例来获取哈希值。

您可以实施一个系统,使每个用户只能向其他用户提出一次投票,但没有什么可以阻止某人创建多个帐户来绕过限制。

一个常见的解决方案是跟踪哪些IP地址对特定用户进行了投票,并禁止来自同一IP地址的同一用户的多个upvotes。