我想阻止相同的重复请求到我的网站。 例如,有人点击了“刷新”button3次,所以我希望跟随该用户的相同请求被自动阻止。
我知道我可以用PHP或任何服务器端编程语言来做到这一点,但是有没有独立于网站的“便携式”解决scheme,如Apache2configuration或iptables规则?
还有其他方法可以保护这种基本的保护吗?
我很确定,如果你甚至可以在iptables中做这个工作,这将是一个非常糟糕的主意。 iptables理解OSI模型的第3层和第4层; HTTP请求在第7层。
由于HTTP是一种无状态协议,并且您正在尝试根据当前状态给出不同的响应,因此您需要一些跟踪状态的方法。 正常的做法是使用cookie,但这不是跟踪状态的唯一方法。 mod_rewrite能够设置和读取cookies并将它们与正则expression式匹配,所以我们将首先尝试。
您可以使用这些规则来阻止任何页面请求太快,
RewriteRule (\.html|\.php)$ - [CO=recent:true:example.com:1:/] RewriteCond %{HTTP_COOKIE} recent=true RewriteRule (\.html|\.php)$ - [F]
第一条规则会为每个.html或.php页面设置一个cookie,并且过期时间为一分钟。 下一对或规则会导致任何请求带有该cookie的.php或.html页面(即在一分钟内)被拒绝。 一分钟后,cookie 应该过期,不再发送。
这里有一些缺点:它不会将自己限制在同一个URL中,因此每个页面请求必须在上一分钟后一分钟,到期时间在几分钟内,所以一分钟是最短的时间。 你被限制在403个回答中,这些回答不一定非常友好或者提供信息。 这是关于我可以用Apachepipe理的最好的。 nginx有一个更类似于编程的configuration语言,它可以让你做只需要阻止页面刷新而不是其他请求的URI比较。
使用PHP(或其他)将当前URL和时间戳放入会话中(或将IP地址和源端口与当前URL和时间戳一起存储在数据库中,如果客户端不支持cookie,则可以这样做)。可以让你做比较。 如果当前URL和会话中的URL相同,并且时间戳在当前时间的某个阈值内,则可以向它们发送不同的响应。 使用PHP(而不是Apache),你可以用一些适当的文本发送一个503响应(更合理)来解释他们为什么得到响应,而不是他们所期望的页面。
我脑海中最好的select是Javascript和/或键绑定。 绑定执行刷新的密钥(Mac上的Cmd + R,到处都是Ctrl + R,F5),以便拦截它们并使用Javascript来build议用户在刷新之前等待一会儿。 此选项具有最佳的用户体验,并且对服务器的影响最小。