如何阻止来自恶意机器人访问者的 link?
How to block the link from malicious bot visitors?
我正在制作一个活动注册网站。当有人点击 link 时:
<a href="/reserve/10" rel="nofollow">Reserve id=10 event</a>
系统正在为这个访客做十分钟的关于这个事件的 "lock"。在那种情况下,没有人可以在接下来的十分钟内预订此活动。如果当时付款完成,则一切正常,否则事件将再次解锁。我希望这个想法很清楚。
问题:当机器人(google 机器人、恶意机器人或愤怒的客户脚本 :P)访问此页面时,他会看到此 link。然后他进入页面。那么锁就完成了...
另外如果有人访问递归:/reserve/1, /reserve/2, /reserve/3, ...他可以锁定所有事件。
我考虑过为每个事件创建一个随机 md5
字符串。 在这种情况下,每个事件都有(在 id
旁边)唯一代码,例如:1987fjskdfh938hfsdvpowefjosidjf8243
接下来,我可以翻译库,像这样工作:
<a href="/reserve/1987fjskdfh938hfsdvpowefjosidjf8243" rel="nofollow">
Reserve
</a>
在那种情况下,我可以阻止 "bruteforce" 锁定。 但是 link 仍然对机器人可见。
然后我想输入验证码。这就是解决方案。但是验证码……在可用性和用户体验方面并不是那么好。
我看到很少有网站有这样的预订引擎。他们受到保护吗?也许有一个简单的 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 东西,但有时候,有人想破坏一些东西,如果来源很明显,几行代码就可以破坏它。整个事件数据库将被锁定,没有人可以预订。
CRFS + AJAX POST + 每次加载时生成的事件令牌。
总结:不要依赖 GET 请求,尤其是通过 a
个元素。
如果您添加一些事件块速率限制(例如通过 IP)更好。
编辑:(这是一个基本草图)
- 将所有
href="..."
替换为 data-reservation-id=ID
- 在
a[data-reservation-id]
的父元素上委托 click
- 在回调中,只需对 API
进行 POST ajax 调用
- 在 API 的端点检查速率限制中,例如使用 IP
- 如果成功,阻止事件,return 成功,如果不成功,return 错误。
特定 IP 的最大同时保留数
总结:取决于许多简单的机器人在一台主机上运行的事实。限制主机同时预订的数量。
基本场景:
- 将请求 IP 与预订一起存储
根据预留请求计算未完成预留的 IP。
SELECT Count(ip) FROM reservations WHERE ip=:request_ip AND status=open;
如果数量超过某个阈值,则阻止预订。
(这主要是 中第 4 点的扩展)
我正在制作一个活动注册网站。当有人点击 link 时:
<a href="/reserve/10" rel="nofollow">Reserve id=10 event</a>
系统正在为这个访客做十分钟的关于这个事件的 "lock"。在那种情况下,没有人可以在接下来的十分钟内预订此活动。如果当时付款完成,则一切正常,否则事件将再次解锁。我希望这个想法很清楚。
问题:当机器人(google 机器人、恶意机器人或愤怒的客户脚本 :P)访问此页面时,他会看到此 link。然后他进入页面。那么锁就完成了...
另外如果有人访问递归:/reserve/1, /reserve/2, /reserve/3, ...他可以锁定所有事件。
我考虑过为每个事件创建一个随机 md5
字符串。 在这种情况下,每个事件都有(在 id
旁边)唯一代码,例如:1987fjskdfh938hfsdvpowefjosidjf8243
接下来,我可以翻译库,像这样工作:
<a href="/reserve/1987fjskdfh938hfsdvpowefjosidjf8243" rel="nofollow">
Reserve
</a>
在那种情况下,我可以阻止 "bruteforce" 锁定。 但是 link 仍然对机器人可见。
然后我想输入验证码。这就是解决方案。但是验证码……在可用性和用户体验方面并不是那么好。
我看到很少有网站有这样的预订引擎。他们受到保护吗?也许有一个简单的 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 东西,但有时候,有人想破坏一些东西,如果来源很明显,几行代码就可以破坏它。整个事件数据库将被锁定,没有人可以预订。
CRFS + AJAX POST + 每次加载时生成的事件令牌。
总结:不要依赖 GET 请求,尤其是通过 a
个元素。
如果您添加一些事件块速率限制(例如通过 IP)更好。
编辑:(这是一个基本草图)
- 将所有
href="..."
替换为data-reservation-id=ID
- 在
a[data-reservation-id]
的父元素上委托 - 在回调中,只需对 API 进行 POST ajax 调用
- 在 API 的端点检查速率限制中,例如使用 IP
- 如果成功,阻止事件,return 成功,如果不成功,return 错误。
click
特定 IP 的最大同时保留数
总结:取决于许多简单的机器人在一台主机上运行的事实。限制主机同时预订的数量。
基本场景:
- 将请求 IP 与预订一起存储
根据预留请求计算未完成预留的 IP。
SELECT Count(ip) FROM reservations WHERE ip=:request_ip AND status=open;
如果数量超过某个阈值,则阻止预订。
(这主要是