我正在解析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”之后的逗号。显然我没有多个用户代理,因此拆分此标题没有意义。
用户代理字符串是唯一的例外,还是还有更多?
答案 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中,例如pthread
为defined in RFC7231 Section 5.3.2。
我遇到了这个具体问题wrote a parser和tested it on edge cases。 parsing the header non-trivial不仅可以解释它并提供correct result is also non-trivial。
某些标题比其他标题更复杂,但基本上每个标题都有自己的语法,应该尊重它以进行正确(和安全)处理。
答案 1 :(得分:1)
如果该标题字段的整个字段值被定义为以逗号分隔的列表[即#(values)]
所以这是另一种方式。当规范说Field: value1, value2
支持Field: value1
时,您只能假设Field: value2
等同于Field
+ #(value)
,即以逗号分隔的值列表。
答案 2 :(得分:0)
通过阅读规范,我得出结论以下标题支持多个(逗号分隔)值:
您可以使用它来创建可拆分标题的白名单。