我正在制作一个活动注册网站。当有人点击链接时:
<a href="/reserve/10" rel="nofollow">Reserve id=10 event</a>
系统正在进行锁定&#34;在这个活动上,这个访客十分钟。在这种情况下,没有其他人可以在接下来的十分钟内保留此事件。如果付款在该时间内完成,则一切正常,否则事件将再次解锁。我希望这个想法很清楚。
问题:当bot(谷歌机器人,恶意机器人或愤怒的客户脚本:P)访问此页面时,他会看到此链接。然后他进入了页面。锁定完成......
如果有人访问递归:/ reserve / 1,/ reserve / 2,/ reserve / 3,......他可以锁定所有事件。
我考虑为每个事件创建一个随机md5
字符串。在这种情况下,每个事件都有(id
)唯一代码,例如:{{ 1}}
接下来,我可以翻译库,就像这样工作:
1987fjskdfh938hfsdvpowefjosidjf8243
在这种情况下,我可以防止&#34;暴力&#34;锁定。但机器人仍然可以看到该链接。
然后我想到进入验证码。这就是解决方案。但是验证码......在可用性和用户体验方面并不是那么好。
我看到很少有网站预订引擎像这样工作。他们受到保护吗?也许有一个简单的ajax / javascript解决方案,以防止机器人将其作为纯文本阅读?我想过:
<a href="/reserve/1987fjskdfh938hfsdvpowefjosidjf8243" rel="nofollow">
Reserve
</a>
但是我不知道我该怎么做以防止机器人计算它。我的意思是愚蠢的机器人甚至无法遵循javascript或jquery的东西,但有时候,有人想破坏某些东西,如果来源很明显,可以用几行代码来破解它。整个事件数据库将被锁定,没有任何预留选项。
答案 0 :(得分:3)
每次加载时都会生成CRFS + AJAX POST + EVENT TOKEN。
摘要:不要依赖GET请求,特别是通过a
元素。
如果添加一些事件块速率限制(例如通过IP),则更好。
编辑:(这是基本草图)
href="..."
替换为data-reservation-id=ID
click
a[data-reservation-id]
答案 1 :(得分:1)
特定于IP的最大同时预订
总结:依赖于许多简单机器人在一台主机上运行的事实。限制主机同时预订的数量。
基本观点:
在预订请求中,计算未完成预订的IP。
SELECT Count(ip) FROM reservations WHERE ip=:request_ip AND status=open;
如果该数字高于某个阈值,请阻止预订。
(这主要是avetist's excellent answer中给出的第4点的扩展)