我正在设计一个网站进行实验,会有一个按钮供用户使用must点击并按住一段时间,然后松开,然后客户端向服务器提交AJAX事件。
但是,为了防止自动点击机器人和快速垃圾邮件,我希望保持时间非常真实且不可跳过,例如做一些计算。重点是浪费实际的 CPU 时间,这样您就不能简单地猜测 AJAX 回调值或调高系统时钟来绕过它。
有没有什么算法可以
- 快速且轻松地生成挑战在服务器上
- 在客户端执行需要花费一些时间,没有欺骗或缩短时间。
- 轻松快速地验证response服务器上的结果?
您正在寻找一个工作量证明系统 http://en.wikipedia.org/wiki/Proof-of-work_system.
最流行的算法似乎是Hashcash http://www.hashcash.org/(也于维基百科 http://en.wikipedia.org/wiki/Hashcash),用于比特币等。基本思想是要求客户端程序找到具有一定数量前导零的哈希值,这是他们必须用蛮力解决的问题。
基本上,它的工作原理是这样的:客户端拥有某种令牌。对于电子邮件,这通常是收件人的电子邮件地址和今天的日期。所以它可能看起来像这样:
[email protected] /cdn-cgi/l/email-protection:04102011
客户端现在必须找到一个随机字符串放在前面:
[email protected] /cdn-cgi/l/email-protection:04202011
这样它的哈希值就有一堆前导 0。 (我的例子不起作用,因为我只是编了一个数字。)
然后,在你这边,你只需要接受这个随机输入并运行single对其进行哈希,检查它是否以一堆 0 开头。这是一个very快速操作。
原因是client必须花费大量的 CPU 时间来找到正确的哈希值,这是一个暴力问题。唯一知道要做的就是选择一个随机字符串,对其进行测试,如果不起作用,请选择另一个字符串。
当然,由于您不处理电子邮件,因此您可能希望使用某种不同的令牌,而不是电子邮件地址和日期。但是,就您而言,这很简单:您只需在服务器端编写一个随机字符串并将其传递给客户端即可。
这种特定算法的优点之一是调整难度非常容易:只需更改所需的前导零数量即可。您需要的零越多,客户端花费的时间就越长;但是,您的验证仍然需要相同的时间。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)