- 安全测试教程
- 安全测试 - 首页
- 安全测试 - 概述
- 安全测试 - 流程
- 安全测试 - 恶意软件
- HTTP 协议基础
- HTTPS 协议基础
- 编码和解码
- 安全测试 - 密码学
- 安全测试 - 同源策略
- 安全测试 - Cookie
- 黑客攻击 Web 应用程序
- 安全测试 - 注入
- 测试身份验证失效
- 测试跨站脚本攻击
- 不安全的直接对象引用
- 测试安全配置错误
- 测试敏感数据泄露
- 缺少函数级访问控制
- 跨站请求伪造
- 存在漏洞的组件
- 未经验证的重定向和转发
- 安全测试 - Ajax 安全
- 测试安全 - Web 服务
- 安全测试 - 缓冲区溢出
- 安全测试 - 拒绝服务
- 测试恶意文件执行
- 安全测试 - 自动化工具
- 安全测试有用资源
- 安全测试 - 快速指南
- 安全测试 - 有用资源
- 安全测试 - 讨论
安全测试 - HTTP 头字段
HTTP 头字段
HTTP 头字段提供关于请求或响应,或关于消息体中发送的对象所需的信息。HTTP 消息头有四种类型:
通用报头 - 这些报头字段对请求和响应消息都具有普遍适用性。
客户端请求报头 - 这些报头字段仅适用于请求消息。
服务器响应报头 - 这些报头字段仅适用于响应消息。
实体报头 - 这些报头字段定义关于实体体或(如果不存在实体体)的元信息。
通用报头
现在让我们详细了解一下通用报头。
Cache-control
Cache-Control 通用报头字段用于指定所有缓存系统必须遵守的指令。语法如下:
Cache-Control : cache-request-directive|cache-response-directive
HTTP 客户端或服务器可以使用Cache-control通用报头来指定缓存的参数或请求缓存中的特定类型的文档。缓存指令以逗号分隔的列表形式指定。例如:
Cache-control: no-cache
以下是客户端在其 HTTP 请求中可以使用的重要的缓存请求指令:
| 序号 | 缓存请求指令和描述 |
|---|---|
| 1 | no-cache 缓存不能使用响应来满足后续请求,除非成功地与源服务器重新验证。 |
| 2 | no-store 缓存不应该存储关于客户端请求或服务器响应的任何信息。 |
| 3 | max-age = 秒 指示客户端愿意接受年龄不超过指定秒数的响应。 |
| 4 | max-stale [ = 秒 ] 指示客户端愿意接受已超过其过期时间的响应。如果给出秒数,则其过期时间不能超过该时间。 |
| 5 | min-fresh = 秒 指示客户端愿意接受新鲜度生命周期不小于其当前年龄加上指定秒数的响应。 |
| 6 | no-transform 不要转换实体体。 |
| 7 | only-if-cached 不要检索新数据。缓存只能在缓存中发送文档,并且不应联系源服务器以查看是否存在更新的副本。 |
以下是服务器在其 HTTP 响应中可以使用的重要的缓存响应指令:
| 序号 | 缓存请求指令和描述 |
|---|---|
| 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 = 秒 指示客户端愿意接受年龄不超过指定秒数的响应。 |
| 9 | s-maxage = 秒 此指令指定的最大年龄将覆盖 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
Date
所有 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
所有传输编码值都区分大小写。
Upgrade
Upgrade 通用报头允许客户端指定其支持的附加通信协议,如果服务器认为切换协议合适,则希望使用这些协议。例如:
Upgrade: HTTP/2.0, SHTTP/1.3, IRC/6.9, RTA/x11
Upgrade 报头字段旨在为从 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 报头。
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/html和text/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: encoding types
以下是示例:
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 | expectation-extension
如果服务器收到包含 Expect 字段的请求,并且该字段包含其不支持的预期扩展,则必须以 417(预期失败)状态进行响应。
From
From 请求报头字段包含控制请求用户代理的人类用户的 Internet 电子邮件地址。以下是一个简单的示例:
From: webmaster@w3.org
此报头字段可用于日志记录目的,以及作为识别无效或不需要的请求来源的一种方法。
Host
Host 请求头字段用于指定要请求的资源的互联网主机和端口号。以下是通用语法:
Host : "Host" ":" host [ ":" port ] ;
主机如果没有尾随端口信息,则表示默认端口,即 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
该字段的一个示例是:
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 : entity-tag | HTTP-date
可以使用实体标签或日期来标识已接收的部分实体。例如:
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 请求头字段指定从文档请求的内容的部分范围。以下是通用语法:
Range: bytes-unit = first-byte-pos "-" [last-byte-pos]
字节范围规范中的 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 请求头字段指示它愿意在响应中接受什么扩展传输编码以及它是否愿意在分块传输编码中接受尾部字段。以下是通用语法:
TE: t-codings
"trailers" 关键字的存在表明客户端愿意在分块传输编码中接受尾部字段,并且以以下两种方式之一指定:
TE: deflate TE: TE: trailers, deflate;q = 0.5
如果 TE 字段值为空或不存在 TE 字段,则唯一的传输编码为分块。始终可以接受没有传输编码的消息。
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 : entity-tag
以下是一些简单的示例:
ETag: "xyzzy" ETag: W/"xyzzy" ETag: ""
Location
Location 响应头字段用于将接收者重定向到请求 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
Server 响应头字段包含有关源服务器用于处理请求的软件的信息。以下是通用语法:
Server : product | comment
以下是一个简单的示例:
Server: Apache/2.2.14 (Win32)
如果响应正在通过代理转发,则代理应用程序不得修改 Server 响应标头。
Set-Cookie
Set-Cookie 响应头字段包含一个名称/值对信息,以保留在此 URL 上。以下是通用语法:
Set-Cookie: NAME = VALUE; OPTIONS
Set-Cookie 响应标头包含令牌 Set-Cookie:,后跟一个或多个 cookie 的逗号分隔列表。以下是可以指定为选项的可能值:
| 序号 | 选项和描述 |
|---|---|
| 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(未授权)响应消息中。字段值包含至少一个挑战,该挑战指示适用于 Request-URI 的身份验证方案和参数。以下是通用语法:
WWW-Authenticate : challenge
WWW- Authenticate 字段值,因为它可能包含多个挑战,或者如果提供了多个 WWW-Authenticate 标头字段,则挑战本身的内容可以包含逗号分隔的身份验证参数列表。以下是一个简单的示例:
WWW-Authenticate: BASIC realm = "Admin"
实体头
Allow
Allow 实体头字段列出 Request-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
Content-Location 实体头字段可用于在消息中包含的实体可从请求资源的 URI 分开的某个位置访问时,提供该实体的资源位置。以下是通用语法:
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
假设实体包含总共 1234 个字节,以下是 byte-content-range-spec 值的示例:
- 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-date
以下是一个示例:
Last-Modified: Tue, 15 Nov 1994 12:45:26 GMT