如何根据IP地址对页面请求进行评级

时间:2016-01-13 18:14:43

标签: ruby-on-rails

我在一个触发API调用的页面上被爬虫攻击了很多次。我想限制那些不尊重我的robots.txt的机器人访问该页面。

注意:这个问题不重复..我想要限速而不是IP黑名单。

3 个答案:

答案 0 :(得分:8)

查看gem:Rack::Attack

在生产环境中经过严峻考验。

答案 1 :(得分:3)

如果您在项目中使用redis,则可以非常简单地为API请求实现请求计数器。此方法不仅可以限制机器人访问,还可以根据您的偏好使用不同的策略限制不同的API请求。如果您想自己实施限制,请this gemthis 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