限制来自任何给定IP地址的请求数

Occ*_*cam 3 python google-app-engine webapp2

我正在开发一个Google App Engine项目(python/webapp2),我有点担心滥用/垃圾邮件我正在创建的服务有大量请求.为了克服这种潜力,我的想法是限制应用程序某些部分在任何给定时间内每个IP地址允许的请求数.我目前的计划如下:

在每个请求我将:

  1. 从标题中获取IP地址
  2. 使用时间戳将此IP地址存储在dataStore中
  3. 删除超过一小时的任何IP地址实体
  4. 计算具有该IP地址的dataStore实体的数量
  5. 如果超过给定限制,则禁止访问

我的问题是:
这是最好的方法吗?我在这里只是一个初学者,我想这样做会有相当多的开销,这可能是一个可能有更好解决方案的常见任务.有没有更好的方法来做这个资源密集度较低的方法?

Jes*_*sak 10

在过去,我用memcache做了这个,速度要快得多,特别是因为你只关心近似限制(近似因为memcache可以被系统刷新,可能不会被所有实例共享等等).您甚至可以使用它来为您过期密钥.像这样的东西(假设self是一个webapp2请求处理程序,你已经导入了GAE的memcache库):

memcache_key = 'request-count-' + self.request.remote_addr

count = memcache.get(memcache_key)

if count is not None and count > MAX_REQUESTS:
    logging.warning("Remote user has %d requests; rejecting." % (count))
    self.error(503)
    return

count = memcache.incr(memcache_key)
if count is None:
    # key didn't exist yet
    memcache.add(memcache_key, 1, time=WINDOW_IN_SECONDS)
Run Code Online (Sandbox Code Playgroud)

这将创建一个密钥,在WINDOW_IN_SECONDS时间内关于MAX_REQUESTS后拒绝用户,将每个WINDOW_IN_SECONDS的计数重新归零.(即它不是一个滑动窗口;它在每个时间段重置为零.)