HTTP响应标头,对同一来源的其他资源造成副作用

时间:2018-01-02 10:30:57

标签: http http-headers response-headers

我有一台服务器,它为同一主机名上的多个用户托管资源。例如:

我想允许用户为其目录中的资源指定自己的响应头,类似于在AWS S3上执行的操作。例如,Carol可能希望她的TODO列表可以从另一个域的脚本中读取,因此她可能希望Access-Control-Allow-Origin: *设置为todo.txt

虽然我希望此功能尽可能灵活,但我不能仅允许指定任何响应头,因为某些响应头对整个源或主机名都有副作用。例如,Set-Cookie可以用于一个人的目录,但是用户代理可以使用cookie值向其他人的目录发出请求。另一个例子是,用户可以设置Strict-Transport-Security,可能会阻止其他用户使用普通的HTTP。

哪些其他HTTP响应标头可能会对整个原点产生副作用,而不仅仅是请求的资源?到目前为止我的清单:

  • 替代-SVC
  • 公钥-Pins的
  • 服务器
  • 设置Cookie
  • 严格-运输和安全

1 个答案:

答案 0 :(得分:1)

我不建议阻止可能影响整个域的响应头,而是建议采用稍微不同的方法,并指定一个肯定可以使用的响应头的白名单。可能存在非标准的新的,实验性的或特定于浏览器的标头,但可能会影响具有特定浏览器的用户的整个域。

我建议以下标题可以安全使用,并且应该是您的用户需要修改的所有内容:

  • 访问控制允许来源
  • 接入控制允许证书
  • 访问控制 - 暴露 - 接头
  • 访问控制 - 最大值 - 年龄
  • 接入控制允许的方法
  • 接入控制允许接头
  • 年龄
  • 允许
  • 缓存控制
  • 内容处置
  • 内容编码
  • 内容的语言
  • 的Content-Length
  • 内容位置
  • 内容型
  • 内容类型
  • 日期
  • 的ETag
  • 到期
  • 上次修改
  • 链接
  • 位置
  • 附注
  • 重发后
  • 传送编码

对于文件和html页面等静态内容,我不会手动设置Content-Range或Content-Length。服务器应自动设置许多这些标头。然而,覆盖它们可能对某些用户有意义。如果您的服务器支持,则Transfer-Encoding可用于在传输过程中添加gzipdeflate,但不得与HTTP / 2一起使用。

同样位置,允许和重试 - 仅对某些状态代码有意义。你可能想省略它们