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

Is it safe to do case insensitive comparison on AppEngine headers?

AppEngine 对任务中的特定 header 做出了一些保证。具体来说,一组header,例如X-AppEngine-QueueName,是用户无法设置的。

These headers are set internally by App Engine: If an external user request attempts to set these headers, they are removed. Therefore, if your request handler finds any of these headers in a request, that task queue request is guaranteed to be valid.

似乎 GAE 提供的两个 Web 框架(webappwebapp2)都有继承自 webob.RequestRequest objects。不幸的是,据我所知,webob.Request 只公开了 case-insensitive way 中的 header。 AppEngine 是否保证用户无法以 case-insensitive 的方式提供那些请求 header?

换句话说,用户是否可以在请求上设置X-AppEngine-Queuename header并让它通过(此时,webob将无法区分header 而真实的是GAE提供的)?

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

所以我做了一些实验,看起来 GAE 确实以 case-insensitive 的方式清理了 headers(正如基于 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 中导航到我的站点,并打开了开发工具。我在“网络”选项卡中找到了我修改过的处理程序的请求。 Right clicking this gives the option to copy the request as cURL 所以我这样做并将其粘贴到 shell 脚本中。然后我修改了复制的请求以删除所有 cookie(我不希望 GAE 将我识别为 app-admin)并添加 x-appengine-queuename: boom header。我提交了 curl 请求并查看了我的日志。没有 x-appengine-queuename header。我还添加了一个 x-appengine-mgilson: test header 并且 header 通过了。

从实现方面来看,环境中的 header 都是大写的(例如 self.request.headers.environ 具有所有 upper-case 键,但有一些例外都以 wsgi. 开头 - - 像 wsgi.run_once)。 header 都以 HTTP_ 为前缀——我猜这是某个标准的一部分……webob 去掉了 HTTP_ 和 title-cases 在 self.request.headers 中查找值时 header 名称的其余部分(大概是为了遵守前面提到的 RFC,并提供更好的 human-readible 版本)。