【问题标题】:How to design user id for a website?如何为网站设计用户ID?
【发布时间】:2013-04-29 07:31:47
【问题描述】:

我正在开发一个玩具网站,我已经实现了一个支持按钮,其 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 控制台,更改用户名并伪造一个支持说 alice 而不是 bob 的请求。我调查了几个网站,发现他们使用一个看起来像哈希的长字符串来表示用户。我想知道这通常是如何实现的?在更一般的形式中,我正在寻找一种算法:

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

【问题讨论】:

  • 服务器是如何实现的?你在使用框架吗?
  • @Aya 我正在使用 django
  • 你在用Django的built-in authentication framework吗?
  • @Aya 是的,我用过。但是这里 bob 不是 request.user,bob 是被点赞的,点赞的可能是 mike 这样的人。
  • 这里的用例是什么?您是在为用户点赞,还是用户发布了一些信息?

标签: python html django algorithm web


【解决方案1】:

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

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

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

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

【讨论】:

    【解决方案2】:

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

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

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

    一种常见的解决方案是跟踪哪些 IP 地址为特定用户投票,并禁止同一 IP 地址为同一用户多次投票。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-23
      • 2010-11-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多