12

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

4 回答 4

17

除了 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):
        ....
于 2013-01-07T13:58:14.080 回答
6

您需要添加

login: admin

给hander,详细说明如下:Securing URLS for Cron

例如

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

handlers:
- url: /updateData
  script: reports.app
  login: admin
于 2013-01-07T10:28:51.783 回答
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()
于 2019-11-26T20:48:30.620 回答
0

谷歌云文档有一些错误。

  1. 请求标头应该是x-appengine-cron(全部小写!)并且预期值是"true"字符串。
  2. 源 IP 地址x-forwarded-for必须以10.(如内部网络 IP 10.1.1.1)或0.(如本地 IP 0.1.0.2)开头。
于 2021-04-05T16:53:12.427 回答