我想创建一个投票网站。客户端请求使用POST
回答投票,服务器将使用候选服务器进行响应。然后,客户端向服务器发送带有候选信息和胜利者的POST
,然后服务器存储在该信息中。我希望通过向服务器反复发送他们的投票来防止客户端操纵结果。我想的一种方法是:
不过,我想找一种更优雅的方法来做这件事。首先,我很难想到一种不是静止的盐。我不希望用户受到IP地址的限制,所以不能包含在salt中。在那之后,我想不出一种好的方法来腌制我的哈希。
其次,我想找到一种不用在服务器上存储信息的方法。如果我能够创建一个可以快速计算而不是存储的验证方法,那将会更好(除非存储肯定比计算更好,因为它可能更快?)
第三,我应该悄悄地失败,还是显式地将错误通知客户端?
发布于 2015-09-08 17:27:06
听起来你真的有两个问题:
这些都是微妙的不同。重放攻击是简单地多次发送请求,可能有细微的变化,也可能是由第三方发送。多次投票就是这样:合法地投票不止一次。
这里的核心问题是你不知道客户是谁。如果客户端移动位置(IP或子网)怎么办?是新客户吗?即使你认为你知道他们是谁,在抽象的层面上,你也不知道。
这不是什么新问题。总的来说,大多数互联网通过要求客户创建帐户来解决这个问题。身份验证发生在TLS上,确保客户端是他们所说的那个人。完成此操作后,客户端可以通过服务器将其存储在数据库中的TLS连接发送其投票。一个客户ID (如电子邮件地址或帐户名称),一票。
这可以防止重放攻击: TLS已经通过设计增强了对这些攻击的抵抗力。这也防止了多次投票:投票是根据数据库中的帐户ID链接起来的,这使得查看特定客户端是否已经投票变得非常容易。只需有一个由轮询ID和帐户ID组成的多部分主键。另一个字段存储投票。您可以添加可选元数据,如IP地址和投票日期/时间。
这里没有理由重新发明轮子: TLS和一些基本的数据库设计可以轻松地解决您的问题,并且比任何本土开发的解决方案都要好得多。
发布于 2015-09-08 16:20:54
https://softwareengineering.stackexchange.com/questions/296473
复制