我正在制作一个活动注册网站。当有人点击链接时:
<a href="/reserve/10" rel="nofollow">Reserve id=10 event</a>
系统正在为此访客“锁定”此事件十分钟。在这种情况下,没有其他人可以在接下来的十分钟内预订此活动。如果在那个时间内完成付款,一切正常,否则事件再次解锁。我希望这个想法很清楚。
问题:当机器人(谷歌机器人、恶意机器人或愤怒的客户脚本:P)访问此页面时,他会看到此链接。然后他进入页面。然后锁就完成了...
此外,如果有人递归访问:/reserve/1, /reserve/2, /reserve/3, ... 他可以锁定所有事件。
我考虑md5
为每个事件创建一个随机字符串。在这种情况下,每个事件都有(旁边id
)唯一的代码,例如:1987fjskdfh938hfsdvpowefjosidjf8243
接下来,我可以翻译库,像这样工作:
<a href="/reserve/1987fjskdfh938hfsdvpowefjosidjf8243" rel="nofollow">
Reserve
</a>
在那种情况下,我可以防止“蛮力”锁定。但该链接仍然对机器人可见。
然后我想到了输入验证码。这就是解决方案。但是验证码......在可用性和用户体验方面并不是那么好。
我看到很少有预订引擎像这样工作的网站。他们受到保护吗?也许有一个简单的 ajax / javascript 解决方案来防止机器人将其作为纯文本阅读?我想过:
<a href="/registerthisvisitorasbot" id="reserve">Reserve</a>
<script type="text/javascript">
$('#reserve').click(function(e) {
e.preventDefault();
var address = ...;
// something not so obvious to follow?
// for example: md5(ajaxget(some_php_file.php?salt=1029301))
window.location('/reserve/' + address);
});
</script>
但我不确定我应该在那里做什么来防止机器人计算它。我的意思是愚蠢的机器人甚至无法遵循 javascript 或 jquery 的东西,但有时,有人想要破坏某些东西,如果来源很明显,几行代码就可以破解它。整个事件数据库将被锁定,没有人可以预订。