我正在一个玩具网站上工作,我已经实现了一个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的请求。我调查了几个网站,看到他们使用长字符串看起来像哈希代表用户。我想知道这通常如何实施?在更一般的形式中,我正在寻找一种算法:
答案 0 :(得分:2)
您可以生成字符串的加密形式(根据定义,散列不可逆)。
缺点是,如果有人拥有所有用户的列表,他们就可以计算您使用的算法并破坏加密。
执行可逆加密的常用方法是使用base64
:
>>> import base64
>>> secret = base64.b64encode('bob')
>>> secret
'Ym9i'
>>> print base64.b64decode('Ym9i')
bob
答案 1 :(得分:1)
听起来更像是一个设计问题,而不是编码问题。
即使您以某种方式对用户名进行了哈希处理,也总会有办法通过在某个网页上找到该哈希的实例来获取哈希值。
您可以实施一个系统,使每个用户只能向其他用户提出一次投票,但没有什么可以阻止某人创建多个帐户来绕过限制。
一个常见的解决方案是跟踪哪些IP地址对特定用户进行了投票,并禁止来自同一IP地址的同一用户的多个upvotes。