安全测试 - HTTP 标头字段

HTTP 标头字段

HTTP 标头字段提供有关请求或响应或有关在消息正文中发送的对象的必需信息。HTTP 消息标头有四种类型 −

  • General-header − 这些标头字段对请求和响应消息都具有普遍适用性。

  • 客户端请求标头 − 这些标头字段仅适用于请求消息。

  • 服务器响应标头 − 这些标头字段仅适用于响应消息。

  • Entity-header −这些标头字段定义有关实体主体的元信息,如果主体不存在,则定义元信息。

通用标头

现在让我们详细了解通用标头。

Cache-control

Cache-Control 通用标头字段用于指定所有缓存系统必须遵守的指令。语法如下 −

Cache-Control : cache-request-directive|cache-response-directive

HTTP 客户端或服务器可以使用 Cache-control 通用标头来指定缓存的参数或从缓存中请求某些类型的文档。缓存指令在逗号分隔的列表中指定。例如 −

Cache-control: no-cache

客户端可以在其 HTTP 请求中使用以下重要的缓存请求指令 −

S.No. 缓存请求指令和说明
1

no-cache

缓存不得使用响应来满足后续请求,除非原始服务器成功重新验证。

2

no-store

缓存不应存储有关客户端请求或服务器响应的任何信息。

3

max-age = seconds

表示客户端愿意接受年龄为不大于指定的时间(以秒为单位)。

4

max-stale [ = seconds]

表示客户端愿意接受已超过其过期时间的响应。如果给出了秒数,则其过期时间不得超过该时间。

5

min-fresh = seconds

表示客户端愿意接受新鲜度生命周期不小于其当前年龄加上指定时间(以秒为单位)的响应。

6

no-transform

不转换实体主体。

7

only-if-cached ...检索新数据。缓存仅当文档在缓存中时才可以发送该文档,并且不应联系原始服务器以查看是否存在较新的副本。

服务器可以在其 HTTP 响应中使用以下重要的缓存响应指令 −

S.No. 缓存请求指令和说明
1

public

表示响应可能被任何缓存缓存。

2

private

表示响应消息的全部或部分针对单个用户,不得由共享缓存缓存。

3

no-cache

缓存不得使用响应来满足后续请求,除非成功与原始服务器重新验证。

4

no-store

缓存不应存储有关客户端请求或服务器响应的任何内容。

5

no-transform

不转换实体主体。

6

must-revalidate

缓存必须在使用过期文档之前验证其状态,过期的文档不应被重新验证。使用。

7

proxy-revalidate

proxy-revalidate 指令与 must-revalidate 指令含义相同,不同之处在于它不适用于非共享用户代理缓存。

8

max-age = seconds

表示客户端愿意接受年龄不大于指定时间(以秒为单位)的响应。

9

s-maxage = seconds

此指令指定的最大期限将覆盖 max-age 指令或 Expires 标头指定的最大期限。私有缓存始终会忽略 s-maxage 指令。

Connection

Connection 通用标头字段允许发送方指定该特定连接所需的选项,并且不得通过代理通过进一步的连接进行通信。以下是使用连接标头 − 的简单语法

Connection : "Connection"

HTTP/1.1 为发送方定义了"close"连接选项,以表示在响应完成后将关闭连接。例如 −

Connection: close

默认情况下,HTTP 1.1 使用持久连接,其中连接不会在事务后自动关闭。另一方面,HTTP 1.0 默认没有持久连接。如果 1.0 客户端希望使用持久连接,则它使用 keep-alive 参数,如下所示 −

Connection: keep-alive

日期

所有 HTTP 日期/时间戳都必须以格林威治标准时间 (GMT) 表示,无一例外。HTTP 应用程序可以使用以下三种日期/时间戳表示形式中的任何一种 −

Sun, 06 Nov 1994 08:49:37 GMT  ; RFC 822, updated by RFC 1123
Sunday, 06-Nov-94 08:49:37 GMT ; RFC 850, obsoleted by RFC 1036
Sun Nov  6 08:49:37 1994       ; ANSI C's asctime() format

此处第一种格式是最优选的格式。

Pragma

Pragma 通用标头字段用于包含可能适用于请求/响应链上任何接收者的实现特定指令。例如 −

Pragma: no-cache

HTTP/1.0 中定义的唯一指令是 no-cache 指令,并在 HTTP 1.1 中保留以实现向后兼容。将来不会定义新的 Pragma 指令。

Trailer

Trailer 通用字段值表示给定的一组标头字段存在于使用分块传输编码编码的消息的尾部中。以下是使用 Trailer 标头字段 −

的简单语法
Trailer : field-name

Trailer 标头字段中列出的消息标头字段不得包含以下标头字段 −

  • Transfer-Encoding
  • Content-Length
  • Trailer

Transfer-Encoding

Transfer-Encoding 通用标头字段指示已对消息正文应用了哪种类型的转换,以便在发送者和接收者之间安全地传输它。这与内容编码不同,因为传输编码是消息的属性,而不是实体的属性。以下语法显示使用 Transfer-Encoding 标头字段 −

Transfer-Encoding: chunked

所有 transfer-coding 值均不区分大小写。

Upgrade

Upgrade 通用标头允许客户端指定它支持哪些附加通信协议,如果服务器认为适合切换协议,则允许客户端使用哪些附加通信协议。例如 −

Upgrade: HTTP/2.0, SHTTP/1.3, IRC/6.9, RTA/x11

升级标头字段旨在提供一种从 HTTP/1.1 过渡到其他不兼容协议的简单机制

Via

网关和代理必须使用 Via 通用标头来指示中间协议和接收者。例如,请求消息可以从 HTTP/1.0 用户代理发送到代号为"fred"的内部代理,该代理使用 HTTP/1.1 将请求转发到 nowhere.com 的公共代理,后者通过将其转发到 https://www.ics.uci.edu/ 的原始服务器来完成请求。 www.ics.uci.edu 收到的请求将具有以下 Via 标头字段 −

Via:1.0 fred,1.1 nowhere.com (Apache/1.1)

Upgrade 标头字段旨在提供一种从 HTTP/1.1 过渡到其他不兼容协议的简单机制

Warning

Warning 通用标头用于携带有关消息状态或转换的附加信息,这些信息可能不会反映在消息中。响应可能带有多个警告标头。

Warning:warn-code SP warn-agent SP warn-text SP warn-date

客户端请求标头

Accept

Accept 请求标头字段可用于指定响应可接受的某些媒体类型。以下是一般语法 −

Accept: type/subtype [q = qvalue]

可以用逗号分隔列出多种媒体类型,可选的 qvalue 表示接受类型的可接受质量级别,范围为 0 到 1。以下是示例 −

Accept:text/plain; q = 0.5,text/html,text/x-dvi;q = 0.8,text/x-c

这将被解释为 text/htmltext/x-c 是首选媒体类型,但如果它们不存在,则发送 text/x-dvi 实体,如果不存在,则发送 text/plain 实体。

Accept-Charset

Accept-Charset 请求标头字段可用于指示响应可接受哪些字符集。以下是一般语法 −

Accept-Charset: character_set [q = qvalue]

可以用逗号分隔列出多个字符集,可选的 qvalue 表示非首选字符集的可接受质量级别,范围为 0 到 1。以下是示例 −

Accept-Charset:iso-8859-5,unicode-1-1;q = 0.8

如果 Accept-Charset 字段中存在特殊值"*",则该值匹配每个字符集,如果不存在 Accept-Charset 标头,则默认为任何字符集均可接受。

Accept-Encoding

Accept-Encoding 请求标头字段与 Accept 类似,但限制了响应中可接受的内容编码。以下是一般语法 −

Accept-Encoding:编码类型

以下是示例 −

Accept-Encoding: compress, gzip
Accept-Encoding:
Accept-Encoding: *
Accept-Encoding: compress;q = 0.5, gzip;q = 1.0
Accept-Encoding: gzip;q = 1.0, identity; q = 0.5, *;q = 0

Accept-Language

Accept-Language 请求标头字段与 Accept 类似,但限制了作为请求响应的首选自然语言集。以下是一般语法 −

Accept-Language: language [q = qvalue]

可以用逗号分隔列出多种语言,可选的 qvalue 表示非首选语言的可接受质量级别,范围为 0 到 1。以下是示例 −

Accept-Language:da, en-gb;q = 0.8, en;q = 0.7

Authorization

Authorization 请求标头字段值由凭证组成,其中包含用户代理对所请求资源领域的身份验证信息。以下是一般语法 −

Authorization : credentials

HTTP/1.0 规范定义了 BASIC 授权方案,其中授权参数是以 base 64 编码的字符串 username:password。以下是示例 −

Authorization: BASIC Z3Vlc3Q6Z3Vlc3QxMjM =

解码后的值是 guest:guest123,其中 guest 是用户 ID,guest123 是密码。

Cookie

Cookie 请求标头字段值包含为该 URL 存储的信息的名称/值对。以下是一般语法 −

Cookie:name = value

可以用分号分隔指定多个 cookie,如下所示 −

Cookie:name1 = value1;name2 = value2;name3 = value3

Expect

Expect 请求标头字段用于指示客户端需要特定的服务器行为。以下是一般语法 −

Expect : 100-continue |期望扩展

如果服务器收到包含 Expect 字段的请求,该字段包含它不支持的期望扩展,则它必须以 417(期望失败)状态响应。

From

From 请求标头字段包含控制请求用户代理的人类用户的 Internet 电子邮件地址。以下是一个简单的示例 −

From: webmaster@w3.org

此标头字段可用于记录目的,并可用作识别无效或不需要的请求来源的手段。

Host

Host 请求标头字段用于指定所请求资源的 Internet 主机和端口号。以下是一般语法 −

Host : "Host" ":" host [ ":" port ] ;

没有任何尾随端口信息的 host 表示默认端口为 80。例如,原始服务器上对 http://www.w3.org/pub/WWW/ 的请求将是 −

GET /pub/WWW/ HTTP/1.1
Host: www.w3.org

If-Match

If-Match 请求标头字段与方法一起使用以使其成为条件。仅当此标记中的给定值与 ETag 所表示的给定实体标记匹配时,此标头才会请求服务器执行所请求的方法。以下是一般语法 −

If-Match : entity-tag

星号 (*) 匹配任何实体,只有实体存在时交易才会继续。以下是可能的示例 −

If-Match: "xyzzy"
If-Match: "xyzzy", "r2d2xxxx", "c3piozzzz"
If-Match: *

如果没有任何实体标签匹配,或者给出"*"且当前实体不存在,则服务器不得执行请求的方法,并且必须返回 412(前提条件失败)响应。

If-Modified-Since

If-Modified-Since 请求标头字段与方法一起使用,使其具有条件性。如果请求的 URL 自此字段指定的时间以来没有被修改,则服务器将不会返回实体;相反,将返回 304(未修改)响应,不包含任何消息正文。以下是一般语法 −

If-Modified-Since : HTTP-date

An example of the field is −

If-Modified-Since: Sat, 29 Oct 1994 19:43:31 GMT

如果所有实体标签均不匹配,或者给出"*"且当前实体不存在,则服务器不得执行请求的方法,并且必须返回 412(前提条件失败)响应。

If-None-Match

If-None-Match 请求标头字段与方法一起使用,使其具有条件性。仅当此标签中的给定值之一与 ETag 所表示的给定实体标签匹配时,此标头才会请求服务器执行请求的方法。以下是一般语法 −

If-None-Match : entity-tag

星号 (*) 匹配任何实体,并且只有当实体不存在时,交易才会继续。以下是可能的示例 −

If-None-Match:"xyzzy"
If-None-Match:"xyzzy"、"r2d2xxxx"、"c3piozzzz"
If-None-Match:*

If-Range

如果实体未发生更改,则可将 If-Range 请求标头字段与条件 GET 结合使用,以仅请求缺失的实体部分(如果实体未发生更改)和整个实体(如果实体已发生更改)。以下是一般语法 −

If-Range:实体标签 | HTTP 日期

可以使用实体标签或日期来标识已收到的部分实体。例如 −

If-Range: Sat, 29 Oct 1994 19:43:31 GMT

如果文档自指定日期以来没有被修改,则服务器返回 Range 标头指定的字节范围,否则,服务器返回所有新文档。

If-Unmodified-Since

If-Unmodified-Since 请求标头字段与方法一起使用以使其成为条件。以下是一般语法 −

If-Unmodified-Since : HTTP-date

如果请求的资源自此字段中指定的时间以来没有被修改,则服务器应执行请求的操作,就好像 If-Unmodified-Since 标头不存在一样。例如 −

If-Unmodified-Since: Sat, 29 Oct 1994 19:43:31 GMT

如果请求通常会导致除 2xx 或 412 状态以外的任何结果,则应忽略 If-Unmodified-Since 标头。

Max-Forwards

Max-Forwards 请求标头字段提供了一种使用 TRACE 和 OPTIONS 方法的机制,以限制可以将请求转发到下一个入站服务器的代理或网关的数量。以下是一般语法 −

Max-Forwards : n

Max-Forwards 值是一个十进制整数,表示此请求消息可以转发的剩余次数。这对于使用 TRACE 方法进行调试非常有用,可以避免无限循环。例如 −

Max-Forwards : 5

对于 HTTP 规范中定义的所有其他方法,可以忽略 Max-Forwards 标头字段。

Proxy-Authorization

Proxy-Authorization 请求标头字段允许客户端向需要身份验证的代理表明自己(或其用户)的身份。以下是一般语法 −

Proxy-Authorization : credentials

Proxy-Authorization 字段值由包含代理和/或所请求资源领域的用户代理的身份验证信息的凭据组成。

范围

Range 请求标头字段指定从文档请求的内容的部分范围。以下是一般语法 −

Range: bytes-unit = first-byte-pos "-" [last-byte-pos]

byte-range-spec 中的 first-byte-pos 值给出范围内第一个字节的字节偏移量。last-byte-pos 值给出范围内最后一个字节的字节偏移量;也就是说,指定的字节位置是包含在内的。你可以指定一个字节单位为字节字节偏移量从零开始。以下是一个简单的例子 −

- The first 500 bytes 
Range: bytes = 0-499

- The second 500 bytes
Range: bytes = 500-999

- The final 500 bytes
Range: bytes = -500

- The first and last bytes only
Range: bytes = 0-0,-1

可以列出多个范围,用逗号分隔。如果逗号分隔的字节范围中的第一个数字缺失,则假定范围从文档末尾开始计算。如果第二个数字缺失,则范围是从字节 n 到文档末尾。

Referer

Referer 请求标头字段允许客户端指定请求 URL 的资源的地址 (URI)。以下是一般语法 −

Referer : absoluteURI | relativeURI

以下是一个简单的示例 −

Referer:http://www.tutorialspoint.org/http/index.htm

如果字段值是相对 URI,则应相对于 Request-URI 进行解释。

TE

TE 请求标头字段指示它愿意在响应中接受什么扩展 transfer-coding,以及它是否愿意接受分块 transfer-coding 中的尾部字段。以下是一般语法 −

TE: t-codings

关键字"trailers"的存在表明客户端愿意接受分块传输编码中的尾部字段,并且它以以下任一方式指定 −

TE: deflate
TE:
TE: trailers, deflate;q = 0.5

如果 TE 字段值为空或不存在 TE 字段,则唯一的传输编码是 chunked。没有传输编码的消息始终是可以接受的。

User-Agent

User-Agent 请求标头字段包含有关发起请求的用户代理的信息。以下是一般语法 −

User-Agent : product | comment

示例

User-Agent:Mozilla/4.0 (compatible; MSIE5.01; Windows NT)

服务器响应标头

它们是给定的 −

Accept-Ranges

Accept-Ranges 响应标头字段允许服务器指示其接受资源的范围请求。以下是一般语法 −

Accept-Ranges  : range-unit | none

例如,接受字节范围请求的服务器可能会发送

Accept-Ranges: bytes

不接受任何类型的资源范围请求的服务器可能会发送 −

Accept-Ranges: none

这将建议客户端不要尝试范围请求。

Age

Age 响应标头字段传达了发送方对自原始服务器生成响应(或其重新验证)以来的时间量的估计。以下是一般语法 −

Age : delta-seconds

Age 值是非负十进制整数,以秒为单位表示时间。以下是一个简单的示例 −

Age: 1030

包含缓存的 HTTP/1.1 服务器必须在从其自己的缓存生成的每个响应中包含 Age 标头字段。

ETag

ETag 响应标头字段为请求的变体提供实体标签的当前值。以下是一般语法 −

ETag : 实体标签

以下是简单的例子 −

ETag: "xyzzy"
ETag: W/"xyzzy"
ETag: ""

Location

Location 响应标头字段用于将接收者重定向到除 Request-URI 之外的位置以完成操作。以下是一般语法 −

Location : absoluteURI

以下是一个简单的示例 −

Location: http://www.tutorialspoint.org/http/index.htm

Content-Location 标头字段与 Location 不同,Content-Location 标识请求中包含的实体的原始位置。

Proxy-Authenticate

Proxy-Authenticate 响应标头字段必须作为 407(需要代理身份验证)响应的一部分包含在内。以下是一般语法 −

Proxy-Authenticate : challenge

Retry-After

Retry-After 响应标头字段可与 503(服务不可用)响应一起使用,以指示服务预计对请求客户端不可用的时间。以下是一般语法−

Retry-After : HTTP-date | delta-seconds

以下是两个简单的例子 −

Retry-After: Fri, 31 Dec 1999 23:59:59 GMT
Retry-After: 120

在后一个例子中,延迟为 2 分钟。

服务器

服务器 响应标头字段包含有关原始服务器用于处理请求的软件的信息。以下是一般语法 −

Server : product | comment

以下是一个简单的示例 −

Server: Apache/2.2.14 (Win32)

如果响应通过代理转发,则代理应用程序不得修改服务器响应标头。

Set-Cookie

Set-Cookie 响应标头字段包含要为此 URL 保留的名称/值对信息。以下是一般语法 −

Set-Cookie:NAME = VALUE; OPTIONS

Set-Cookie 响应标头包含标记 Set-Cookie:,后跟一个或多个 cookie 的逗号分隔列表。以下是您可以指定为选项的可能值 −

S.No. 选项和说明
1

Comment = comment

此选项可用于指定与 cookie 相关的任何注释。

2

Domain = domain

Domain 属性指定 cookie 有效的域。

3

Expires = Date-time

cookie 的过期日期。如果为空,则访问者退出浏览器时,cookie 将会过期。

4

Path = path

Path 属性指定此 cookie 适用的 URL 子集。

5

Secure

这指示用户代理仅在安全连接下返回 cookie。

以下是服务器生成的简单 cookie 标头的示例 −

Set-Cookie: name1 = value1,name2 = value2; Expires = Wed, 09 Jun 2021 10:18:14 GMT

Vary

Vary 响应标头字段指定实体具有多个来源,因此可能会根据指定的请求标头列表而变化。以下是一般语法 −

Vary : field-name

您可以指定多个用逗号分隔的标头,星号"*"的值表示未指定的参数不限于请求标头。以下是一个简单的示例 −

Vary: Accept-Language, Accept-Encoding

此处,字段名称不区分大小写。

WWW-Authenticate

WWW-Authenticate 响应标头字段必须包含在 401(未授权)响应消息中。字段值至少包含一个质询,用于指示适用于请求 URI 的身份验证方案和参数。以下是一般语法 −

WWW-Authenticate : challenge

WWW-Authenticate 字段值,因为它可能包含多个质询,或者如果提供了多个 WWW-Authenticate 标头字段,则质询本身的内容可以包含以逗号分隔的身份验证参数列表。以下是一个简单的示例 −

WWW-Authenticate: BASIC realm = "Admin"

实体标头

允许

允许 实体标头字段列出了请求 URI 标识的资源支持的方法集。以下是一般语法 −

Allow : Method

您可以指定多个方法,用逗号分隔。以下是一个简单的示例 −

Allow: GET, HEAD, PUT

此字段不能阻止客户端尝试其他方法。

Content-Encoding

Content-Encoding 实体标头字段用作媒体类型的修饰符。以下是一般语法 −

Content-Encoding : content-coding

内容编码是 Request-URI 标识的实体的特征。以下是一个简单的示例 −

Content-Encoding: gzip

如果请求消息中实体的内容编码不被原始服务器接受,则服务器应使用状态代码 415(不支持的媒体类型)进行响应。

Content-Language

Content-Language 实体标头字段描述了所包含实体的目标受众的自然语言。以下是一般语法 −

Content-Language : language-tag

对于面向多个受众的内容,可能会列出多种语言。以下是一个简单的示例 −

Content-Language:mi,en

Content-Language 的主要目的是允许用户根据自己喜欢的语言识别和区分实体。

Content-Length

Content-Length 实体标头字段指示发送给收件人的实体主体的大小(以 OCTET 的十进制数表示),或者在 HEAD 方法的情况下,指示如果请求是 GET,则将发送的实体主体的大小。以下是一般语法 −

Content-Length : DIGITS

以下是一个简单的示例 −

Content-Length: 3495

任何大于或等于零的 Content-Length 都是有效值。

Content-Location

当可以从与请求资源的 URI 不同的位置访问该实体时,可以使用 Content-Location 实体标头字段来提供消息中包含的实体的资源位置。以下是一般语法 −

Content-Location:  absoluteURI | relativeURI

以下是一个简单的示例 −

Content-Location:http://www.tutorialspoint.org/http/index.htm

Content-Location 的值还定义了实体的基本 URI。

Content-MD5

Content-MD5 实体标头字段可用于提供实体的 MD5 摘要,以便在收到消息时检查消息的完整性。以下是一般语法 −

Content-MD5  : md5-digest using base64 of 128 bit MD5 digest as per RFC 1864

以下是一个简单的示例 −

Content-MD5:8c2d46911f3f5a326455f0ed7a8ed3b3

MD5 摘要是根据实体主体的内容计算的,包括已应用的任何内容编码,但不包括应用于消息主体的任何传输编码。

Content-Range

Content-Range 实体标头字段与部分实体主体一起发送,以指定应在完整实体主体中的何处应用部分主体。以下是一般语法 −

Content-Range : bytes-unit SP first-byte-pos "-" last-byte-pos

byte-content-range-spec 值的示例,假设实体总共包含 1234 个字节 −

- The first 500 bytes:
Content-Range : bytes 0-499/1234

- The second 500 bytes:
Content-Range : bytes 500-999/1234

- All except for the first 500 bytes:
Content-Range : bytes 500-1233/1234

- The last 500 bytes:
Content-Range : bytes 734-1233/1234

当 HTTP 消息包含单个范围的内容时,此内容将通过 Content-Range 标头和显示实际传输的字节数的 Content-Length 标头进行传输。例如,

HTTP/1.1 206 Partial content
Date: Wed, 15 Nov 1995 06:25:24 GMT
Last-Modified: Wed, 15 Nov 1995 04:58:08 GMT
Content-Range: bytes 21010-47021/47022
Content-Length: 26012
Content-Type: image/gif

Content-Type

Content-Type 实体标头字段指示发送给接收者的实体主体的媒体类型,或者,在 HEAD 方法的情况下,指示如果请求为 GET 则发送的媒体类型。以下是一般语法 −

Content-Type : media-type

以下是示例 −

Content-Type: text/html; charset = ISO-8859-4

Expires

Expires 实体标头字段给出响应被视为过时的日期/时间。以下是一般语法 −

Expires : HTTP-date

以下是示例 −

Expires: Thu, 01 Dec 1994 16:00:00 GMT

Last-Modified

Last-Modified 实体标头字段表示源服务器认为变体最后修改的日期和时间。以下是一般语法 −

Last-Modified:HTTP 日期

以下是示例 −

Last-Modified: Tue, 15 Nov 1994 12:45:26 GMT

http_protocol_basics.html