【问题标题】:Google App Engine - Securing url of cron pythonGoogle App Engine - 保护 cron python 的 url
【发布时间】:2017-04-23 17:31:03
【问题描述】:

我是谷歌应用引擎的新手。我想要 cron 的 url 的安全限制,以便它不应该被 url 直接访问。为此,我已经阅读了文档和一些问答 ([Google app engine: security of cron jobs)。

我实施了此链接中建议的login : admin 解决方案。但是我没有实现安全,因为self.request.headers.get('X-AppEngine-Cron')总是None,无论是cron还是直接通过url访问。

所以我不知道请求来自哪里(来自 cron 或直接访问)

def cron_method(BaseRestHandler):
  def check_if_cron(self, *args, **kwargs):
    if self.request.headers.get('X-AppEngine-Cron') is None:
        logging.info("error-- not cron")
        self.UNAUTH = "cron"
        self.raise_exception()
    else:
        return BaseRestHandler(self, *args, **kwargs)

return check_if_cron

我使用自定义处理程序 BaseRestHandler 进行其他身份验证。

@cron_method
def put(self):
    logging.info("inside put--")

这是通过类的 get 方法中的任务队列调用的。 问题是我没有得到标题 X-AppEngine-Cron 任何其他逻辑或方法将不胜感激。

提前致谢。

【问题讨论】:

    标签: python google-app-engine cron decorator


    【解决方案1】:

    您似乎试图使支票成为装饰者。

    但您的代码显示了应用于 put() 方法的装饰器,而不是 get() 方法 - cron 仅在 get() 上执行。

    你的装饰器在我看来也不太合适。装饰器不应该将函数作为参数并返回一些本地定义的函数,该函数执行(不返回)作为参数接收的函数吗?

    我建议您回到基础 - 尝试在处理程序本身的 get 方法中进行标头检查,并且只有在您完成该工作后,才考虑进一步进行更复杂的更改,例如在装饰器中进行检查。

    您的装饰器不工作的可能性比 GAE 记录的基础设施不工作的可能性更大。保持简单(起初)至少会帮助您的调查工作指向更好的方向。

    试试这个:

    def cron_method(handler_method):
    
        def check_if_cron(self, *args, **kwargs):
    
            if self.request.headers.get('X-AppEngine-Cron') is None:
                logging.info("error-- not cron")
                self.UNAUTH = "cron"
                self.raise_exception()
            else:
                handler_method(self, *args, **kwargs)
    
        return check_if_cron
    

    至于来自任务队列的调用 - 这些请求不再是 cron 请求,即使任务是由 cron 请求创建并入队的。

    来自Securing task handler URLs

    如果任务执行敏感操作(例如修改数据),您 可能希望保护其工作人员 URL 以防止恶意外部 用户直接调用它。您可以阻止用户访问 通过限制对 App Engine administrators 的访问来完成任务 URL。 任务请求本身由 App Engine 发出,并且始终可以 目标受限网址。

    您可以通过将login: admin 元素添加到 app.yaml 文件中的处理程序配置。

    如果您还想防止手动访问这些 URL(即仅将其限制为任务队列请求),您可以执行类似于 cron 的标头检查。标头值在Reading request headers 中列出。我个人选择了X-AppEngine-TaskName

    【讨论】:

    • 感谢它的工作。 @Dan Corniescu。但是现在,我无法检查任务队列中下一个光标的标题或装饰器条件。
    • 我不确定我是否完全理解该评论。检查我的更新,如果它不是您想要的,我建议提出一个新问题(在一篇文章中混合太多东西不好)。
    猜你喜欢
    • 2010-11-17
    • 1970-01-01
    • 2014-04-16
    • 2011-02-15
    • 1970-01-01
    • 2015-11-19
    • 2012-12-20
    • 1970-01-01
    • 2017-11-30
    相关资源
    最近更新 更多