在AppEngine标题上进行不区分大小写的比较是否安全?

时间:2017-03-07 20:01:57

标签: python security google-app-engine webapp2 google-app-engine-python

AppEngine对任务中的特定标头提供了一些保证。具体而言,用户无法设置一组标题,例如X-AppEngine-QueueName

  

这些标头由App Engine在内部设置:如果外部用户请求尝试设置这些标头,则会删除它们。因此,如果您的请求处理程序在请求中找到任何这些标头,那么该任务队列请求将保证有效。

GAE(webappwebapp2)提供的两个网络框架似乎都有Request个继承自webob.Request的对象。不幸的是,据我所知,webob.Request只会在case-insensitive way中公开标题。 AppEngine是否保证用户无法以不区分大小写的方式提供这些请求标头?

换句话说,用户是否可以在请求上设置X-AppEngine-Queuename标头并将其传递(此时webob将无法区分该标头与提供的标头之间的标头通过GAE)?

webapp2框架中,我如何保证我的请求来自任务而不是恶意用户的结果?

1 个答案:

答案 0 :(得分:1)

所以我做了一些实验,看来GAE确实以不区分大小写的方式清理标题(正如基于RFC 7230 3.2预期的那样)。

对于对我的测试方法感兴趣的人,我首先将以下日志记录语句添加到我的webapp2请求处理程序中:

logging.info('request headers: %s', self.request.headers.items())
logging.info('request env: %s', list(self.request.headers.environ)

然后我打开了开发工具,以chrome方式导航到我的网站。我找到了我在" Network"中修改过的处理程序请求。标签。 Right clicking this gives the option to copy the request as cURL所以我这样做并将其粘贴到shell脚本中。然后我修改了复制的请求以删除所有Cookie(我不希望GAE将我识别为app-admin)并添加x-appengine-queuename: boom标头。我提交了curl请求并查看了我的日志。没有x-appengine-queuename标题。我还添加了一个x-appengine-mgilson: test标题,并且标题已通过。

从实现方面来看,环境具有全部大写标题(例如self.request.headers.environ包含所有大写字母键,但有一些例外情况都以wsgi.开头 - 如wsgi.run_once)。标题都以HTTP_为前缀 - 我猜这是某个标准的一部分... webob剥离HTTP_和标题 - 其他的标题名称在self.request.headers中查找值时(可能符合前面提到的RFC,并提供更好的人类可读版本)。