我在一个触发API调用的页面上被爬虫攻击了很多次。我想限制那些不尊重我的robots.txt的机器人访问该页面。
注意:这个问题不重复..我想要限速而不是IP黑名单。
答案 0 :(得分:8)
查看gem:Rack::Attack
!
在生产环境中经过严峻考验。
答案 1 :(得分:3)
如果您在项目中使用redis
,则可以非常简单地为API请求实现请求计数器。此方法不仅可以限制机器人访问,还可以根据您的偏好使用不同的策略限制不同的API请求。如果您想自己实施限制,请this gem或this guide。
答案 2 :(得分:1)
因此,对于任何有兴趣的人,我找到了一种替代解决方案,无需添加机架攻击或redis。这有点hacky,但嘿,它可能会帮助别人。
count = 0
unless Rails.cache.read("user_ip_#{get_ip}_count").nil?
count = Rails.cache.read("user_ip_#{get_ip}_count") + 1
if count > 20
flash[:error] = "You're doing that too much. Slow down."
redirect_to root_path and return false
end
end
Rails.cache.write("user_ip_#{get_ip}_count", count, :expires_in => 60.minutes)
这将对地理编码器的任何请求限制为20 /小时。出于测试目的:
def get_ip
if Rails.env.production?
@ip = request.remote_ip
else
@ip = "{YOUR_IP}"
end
end
<强>更新强>
我认为这是一个好主意,但事实证明它由于更改了抓取工具的IP地址而无法正常工作。我改为实现了这个相当简单的代码:
if request.bot?
Rails.logger.info "Bot Request Denied from #{get_ip}"
flash[:error] = "Bot detected."
redirect_to root_path and return false
end
使用这个方便的rails gem:voight_kampff