Ruby on rails 如何按IP地址对页面请求进行分级限制

Ruby on rails 如何按IP地址对页面请求进行分级限制,ruby-on-rails,Ruby On Rails,我在一个触发API调用的页面上多次被爬虫攻击。我想限制不尊重我的robots.txt的机器人访问该页面 注意:这个问题不是重复的。。我希望速率限制而不是IP黑名单。如果您在项目中使用redis,您可以非常简单地实现API请求的请求计数器。这种方法不仅可以限制robots访问,还可以根据您的偏好使用不同的策略限制不同的API请求。如果你想自己实现limit,可以选择Look或follow。因此,对于任何感兴趣的人,我找到了一种替代解决方案,它可以在不添加rack attack或redis的情况下工

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


注意:这个问题不是重复的。。我希望速率限制而不是IP黑名单。

如果您在项目中使用
redis
,您可以非常简单地实现API请求的请求计数器。这种方法不仅可以限制robots访问,还可以根据您的偏好使用不同的策略限制不同的API请求。如果你想自己实现limit,可以选择Look或follow。

因此,对于任何感兴趣的人,我找到了一种替代解决方案,它可以在不添加rack attack或redis的情况下工作。这有点麻烦,但嘿,这可能会帮助其他人

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:

查看gem:
Rack::Attack

在生产环境中经过战斗测试

  • GiHub:
  • RailsConf视频:

也许可以使用
rack attack
gem将您希望允许的机器人列入白名单?我认为@Kimgray的响应可能会重复,因为我希望基于IP限制,而不是完全阻止IP。嘿,我只是想知道,在机器人IP地址是动态的情况下,这将如何使用?它仍然会按IP计数,而且机器人只有有限数量的IP供其使用。。。因此,它们很可能都会被标记和阻止。但在设置限制时不要太过激进,因为来自NAT网络的请求..我目前的方法是根据它们的头阻止它们。。。到目前为止似乎工作得很好!您还可以使用其他标识符,而不仅仅是带有Rack::Attack的IP——视频中介绍了这一点。您还可以根据路径限制请求。它还可以制作黑名单。非常有用的gem。我认为你的算法是错误的:如果你每10分钟收到一个请求,你会在3h20(20*10分钟)后收到错误消息,因为每次收到请求时缓存过期日期都会重置。