我希望保护我的任务队列网址免受恶意访问。
在我已获得任务队列请求的视图中:
if not users.is_current_user_admin():
return HttpResponse(status=403)
但我的任务队列收到403错误!我在this GAE documentation的印象中认为任务队列用户是一名管理员。是什么给了什么?
注意:我正在使用DjangoNonRel,因此我无法在app.yaml
中指定仅限管理员的网址访问权限,我必须在视图中以编程方式执行此操作。
答案 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
这将保护您的任务队列URL(据我所知,这仅适用于“拉入队列”)。
我写了一个装饰器来帮我检查。希望这很有帮助
有关更多信息,请参阅Docs