在 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 框架(webapp
和 webapp2
)都有继承自 webob.Request
的 Request
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 版本)。
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 框架(webapp
和 webapp2
)都有继承自 webob.Request
的 Request
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 版本)。