AppEngine对任务中的特定标头提供了一些保证。具体而言,用户无法设置一组标题,例如X-AppEngine-QueueName
。
这些标头由App Engine在内部设置:如果外部用户请求尝试设置这些标头,则会删除它们。因此,如果您的请求处理程序在请求中找到任何这些标头,那么该任务队列请求将保证有效。
GAE(webapp
和webapp2
)提供的两个网络框架似乎都有Request
个继承自webob.Request
的对象。不幸的是,据我所知,webob.Request
只会在case-insensitive way中公开标题。 AppEngine是否保证用户无法以不区分大小写的方式提供这些请求标头?
换句话说,用户是否可以在请求上设置X-AppEngine-Queuename
标头并将其传递(此时webob
将无法区分该标头与提供的标头之间的标头通过GAE)?
在webapp2
框架中,我如何保证我的请求来自任务而不是恶意用户的结果?
答案 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,并提供更好的人类可读版本)。