Google应用引擎:cron作业的安全性

时间:2013-01-07 10:15:33

标签: security google-app-engine cron

GAE为预定的工作提供cron工作。如何设置一些安全性以防止某人直接执行http GET?在以下示例中,我可以随时在浏览器的url字段中键入/ updateData以在以下设置中执行作业:

cron:
- description: daily update of the data in the datastore
  url: /updateData
  schedule: every day 00:00
  timezone: ...

4 个答案:

答案 0 :(得分:10)

除了Paul C所说的你可以创建一个装饰器来检查 X-Appengine-Cron 标题,如下图所示。顺便说一句,标题不能被欺骗,这意味着如果一个未来自cron作业的请求具有此标题,App Engine将更改标题的名称。您也可以为任务编写类似的方法,在这种情况下检查 X-AppEngine-TaskName

"""
Decorator to indicate that this is a cron method and applies request.headers check
"""
def cron_method(handler):
    def check_if_cron(self, *args, **kwargs):
        if self.request.headers.get('X-AppEngine-Cron') is None:
            self.error(403)
        else:
            return handler(self, *args, **kwargs)
    return check_if_cron

并将其用作:

class ClassName(webapp2.RequestHandler):
    @cron_method
    def get(self):
        ....

答案 1 :(得分:6)

您需要添加

login: admin

到了这里,详见:Securing URLS for Cron

E.G。

application: hello-cron
version: 1
runtime: python27
api_version: 1

handlers:
- url: /updateData
  script: reports.app
  login: admin

答案 2 :(得分:0)

目前恐怕文档可能尚未完全更新。正如姚莉所说,您需要检查的标头是“ HTTP_X_APPENGINE_CRON” 这是我针对Python 3.7,Django和GAE Flex的解决方案片段:

from django.http import HttpResponse,HttpResponseForbidden
if 'HTTP_X_APPENGINE_CRON' in request.META:
    if request.META['HTTP_X_APPENGINE_CRON'] == 'true':
        # Handler 
else:
    return HttpResponseForbidden()

答案 3 :(得分:0)

The Google Cloud documentation 有一些错误。

  1. 请求标头应为 x-appengine-cron(全部小写!),预期值为 "true" 作为字符串。
  2. 源 IP 地址 x-forwarded-for 必须以 10.(如在内部网络 IP 10.1.1.1 中)或 0.(如在本地 IP {{1} }).