如何拆分标题值?

时间:2015-04-09 21:22:47

标签: http http-headers rfc2616

我正在解析HTTP标头。我想将标题值拆分为有意义的数组。

例如,Cache-Control: no-cache, no-store应返回['no-cache','no-store']

HTTP RFC2616说:

  

可能存在具有相同字段名称的多个消息头字段   在消息中,当且仅当该标头的整个字段值   字段被定义为以逗号分隔的列表[即,#(值)]。 必须   可以将多个标题字段合并为一个   “field-name:field-value”对,不改变语义   消息,通过将每个后续字段值附加到第一个,每个   用逗号分隔。标题字段的顺序相同   因此,接收字段名称对于解释是重要的   组合字段值,因此代理不得改变   转发邮件时这些字段值的顺序

但我不确定反过来是否正确 - 分裂在逗号上是否安全?

我已经找到了一个导致问题的例子。例如,我的用户代理字符串是

Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.101 Safari/537.36

即,它包含“KHTML”之后的逗号。显然我没有多个用户代理,因此拆分此标题没有意义。

用户代理字符串是唯一的例外,还是还有更多?

3 个答案:

答案 0 :(得分:4)

不,基于逗号分割标头是不安全的。例如,//for part 1 write a program in java tht will take a series of names from the //user //and save them to a file. The user should be able to enter however many names //they want. //Be sure to include basic I/0 instructions so the user knows how to interact //with the //command prompt. import java.io.*; import java.util.Scanner; public class Series{ public static void main(string[] args){ Scanner reader = new Scanner(System.in); String s; do { System.out.println("enter the name now, or enter DONE to close and save"); PrintWriter writer = new PrintWriter (new File("NewSeries.txt")); s=reader.nextString(); writer.println(s); } while (!s.equals("DONE")); { writer.close(); System.out.println("SAVED"); } } } 是一个有效的标题,但如果您尝试拆分逗号以获取mime类型列表,则会得到无效结果。

正确的答案是每个标题都是使用ABNF指定的,其中大部分是在各种RFC中,例如pthreaddefined in RFC7231 Section 5.3.2

我遇到了这个具体问题wrote a parsertested it on edge casesparsing the header non-trivial不仅可以解释它并提供correct result is also non-trivial

某些标题比其他标题更复杂,但基本上每个标题都有自己的语法,应该尊重它以进行正确(和安全)处理。

答案 1 :(得分:1)

  

如果该标题字段的整个字段值被定义为以逗号分隔的列表[即#(values)]

所以这是另一种方式。当规范说Field: value1, value2支持Field: value1时,您只能假设Field: value2等同于Field + #(value),即以逗号分隔的值列表。

答案 2 :(得分:0)

通过阅读规范,我得出结论以下标题支持多个(逗号分隔)值:

  • 接受
  • 接收字符集
  • 接受编码
  • 接受语言
  • 接受贴片
  • 接受-范围
  • 允许
  • 缓存控制
  • 连接
  • 内容编码
  • 内容的语言
  • 期望
  • 如果-匹配
  • 如果-无 - 匹配
  • 附注
  • 代理身份验证
  • TE
  • 拖车
  • 传送编码
  • 升级
  • 因人而异
  • 警告
  • WWW验证
  • X - 转发,对于

您可以使用它来创建可拆分标题的白名单。