正确保护GAE任务队列URL(不使用app.yaml)

时间:2011-05-05 22:27:44

标签: django google-app-engine task-queue django-nonrel djangoappengine

我希望保护我的任务队列网址免受恶意访问。

在我已获得任务队列请求的视图中:

if not users.is_current_user_admin():
    return HttpResponse(status=403)

但我的任务队列收到403错误!我在this GAE documentation的印象中认为任务队列用户是一名管理员。是什么给了什么?

注意:我正在使用DjangoNonRel,因此我无法在app.yaml中指定仅限管理员的网址访问权限,我必须在视图中以编程方式执行此操作。

3 个答案:

答案 0 :(得分:10)

任务可以绕过login: admin限制,但users.is_current_user_admin()仍会返回false,因为技术上没有当前用户。

使用Django-nonrel不应该阻止您使用app.yaml保护您的任务。只需在Django catch-all上面添加一个受保护的处理程序:

handlers:    

- url: /tasks/.+
  script: main.py
  login: admin

- url: .*
  script: main.py

任何以/ tasks /开头的URL都可以被任务队列访问,非管理员访问者无法访问,而不会改变任何路由。

答案 1 :(得分:4)

您的处理程序可以查找任务队列HTTP标头,例如X-AppEngine-QueueName。

来自官方GAE docs

来自Task Queue服务的请求包含以下HTTP标头:

  

X-的AppEngine-QUEUENAME
  X-AppEngine上,TASKNAME
  X-AppEngine上,TaskRetryCount
  X-AppEngine上,TaskExecutionCount
  X-AppEngine-TaskETA

     

这些标头由Google App Engine在内部设置。 如果你的   请求处理程序找到任何这些标头,它可以信任   请求是任务队列请求。如果以上任何标头是   如果您的应用出现在外部用户请求中,则会将其删除。

答案 2 :(得分:0)

您可以通过两次检查来完成

  • 检查远程地址,它将为0.1.0.1
  • 检查标头[ X-Appengine-Cron ]的存在。

这将保护您的任务队列URL(据我所知,这仅适用于“拉入队列”)。

我写了一个装饰器来帮我检查。希望这很有帮助

有关更多信息,请参阅Docs