# 第七章 为 Cookie 服务和其他首部字段 > 作者:肖鹏-SpiritLing 时间:2019-01-30 > 包含 为 `Cookie` 服务的首部字段和其他首部字段 ## 第一节 为 Cookie 服务的首部字段 管理服务器与客户端之间状态的 `Cookie` ,虽然没有被编入标准化 HTTP/1.1 的 RFC2616 中,但在 Web 网站方面得到广泛的应用。 `Cookie` 的工作机制是用户识别及状态管理。web 网站为了管理用户的状态会通过 web 游览器,把一些数据临时写入用户的计算机内。接着当用户访问该 web 网站时,可通过通信方式取回之前存放的 `Cookie` 。 调用 `Cookie` 时,由于可校验 `Cookie` 的有效期,以及发送方的域、路径、协议等信息,所以正规发布的 `Cookie` 内的数据不会因来自其他 web 站点和攻击者的攻击而泄露。 在目前使用最广泛的 `Cookie` 标准却不是 RFC 中定义的任何一个。而是在网景公司指定的标准上进行扩展后的产物。 下面是与 `Cookie` 有关的首部字段 | 首部字段名 | 说明 | 首部类型 | | --- | --- | --- | | Set-Cookie | 开始状态管理所使用的 `Cookie` 信息 | 响应首部字段 | | Cookie | 服务器接收到的 `Cookie` 信息 | 请求首部字段 | ### 第一小节 Set-Cookie 字段 ```http Set-Cookie: status-enable; expires=Tue, 05 Jul 2018 02:01:22 GMT; path=/; domain=.example.com; ``` 当服务器准备开始管理客户端的状态时,会事先告知各种信息。下面表格列举了 `Set-Cookie` 的字段值。 | 属性 | 说明 | | --- | --- | | NAME=VALUE | 赋予 `Cookie` 的名称和其值(必须项) | | expires=DATE | `Cookie` 的有效期(若不明确指定则默认为游览器关闭前为止) | | path=PATH | 将服务器上的文件目录作为 `Cookie` 的适用对象(若不指定则默认文档所在的文件目录) | | domain=域名 | 作为 `Cookie` 适用对象的域名(若不指定则默认为创建 `Cookie` 的服务器域名) | | Secure | 仅在 HTTPS 安全通信时才会发送 `Cookie` | | HttpOnly | 加以限制,使 `Cookie` 不能被 JavaScript 脚本访问 | * **expires 属性** `Cookie` 的 `expires` 属性指定游览器可发送 `Cookie` 的有效期。 当省略 `expires` 属性时,其有效期仅限于维持游览器会话(Session)时间段内。这通常限于游览器应用程序被关闭之前。 另外,一旦 `Cookie` 从服务器端发送至客户端,服务器端就不存在可以显示删除 `Cookie` 的方法。但可以通过覆盖已过期的 `Cookie` ,实现对客户端 `Cookie` 的实质性删除操作。 * **path 属性** `Cookie` 的 `path` 属性可用于限制指定 `Cookie` 的发送范围的文件目录。不过另有办法避开这项限制,看来对其作为安全机制的效果不能报有期待。 * **domain 属性** 通过 `Cookie` 的 `domain` 属性指定的域名可做到与结尾匹配一致。比如,当指定 `example.com` 后,除 `example.com` 以外,`www.example.com` 或 `www2.example.com` 等都可以发送 `Cookie` 。 因此,除了针对具体指定的多个域发送 `Cookie` 之外,不指定 `domain` 属性显得更安全。 * **secure 属性** `Cookie` 的 `secure` 属性用于限制 web 页面仅在 HTTPS 安全连接时,才可以发送 `Cookie` 。 发送 `Cookie` 时,指定 `secure` 属性的方法如下所示。 ```http Set-Cokkie: name=VALUE; secure ``` 以上例子仅当在 `https://www........`(HTTPS)安全连接的情况下才会进行 `Cookie` 的回收,也就是说,即使域名相同,`http://www......`(HTTP)也不会发生 `Cookie` 的回收行为。 当省略 `secure` 属性时,不论 HTTP 还是 HTTPS ,都会对 `Cookie` 进行回收。 * **HttpOnly 属性** `Cookie` 的 `HttpOnly` 属性是 `Cookie` 的扩展功能,它使 JavaScript 脚本无法获得 `Cookie` 。其主要目的为防止跨站脚本攻击(Cross-sitescripting,XSS)对 `Cookie` 的信息窃取。 发送指定 `HttpOnly` 属性的 `Cookie` 的方法如下所示。 ```http Set-Cookie: name=value; HttpOnly ``` 通过上述设置,通常从 web 页面内还可以对 `Cookie` 进行读取操作。但使用 JavaScript 的 document.cookie 就无法读取附加 `HttpOnly` 属性后的 `Cookie` 的内容了。因此,也就无法在 XSS 中利用 JavaScript 劫持 `Cookie` 了。 虽然是独立的扩展功能,但 Internet Explorer 6 SP1 以上版本等当下的主流游览器都已经支持该扩展了。另外顺带一提,该扩展并非是为了防止 XSS 而开发的。 ### 第二小节 Cookie 字段 ```http Cookie: status=enable ``` 首部字段 `Cookie` 会告知服务器,当客户端想获得 HTTP 状态管理支持时,就会在请求中包含从服务器接受到的 `Cookie` 。接受到多个 `Cookie` 时,同样可以以多个 `Cookie` 形式发送。 ## 第二节 其他首部字段 HTTP 首部字段是可以自行扩展的。所以在 Web 服务器和游览器的应用上,会出现各种非标准的首部字段。 下面是一些比较常用的首部字段/ * X-Frame-Options * X-XSS-Protection * DNT * P3P ### 第一小节 X-Frame-Options 字段 ```http X-Frame-Options: DENY ``` 首部字段 `X-Frame-Options` 属于 HTTP 响应首部,用于控制网站内容在其他 web 网站的 Frame 标签内显示问题。其主要目的是为了防止点击劫持(clickjacking)攻击。 首部字段 `X-Frame-Options` 有以下两个可指定的字段值。 * **DENY** 拒绝 * **SAMEORIGIN** 仅同源域名下的页面(Top-level-browsing-context)匹配时许可。 支持该首部字段的游览器有:Internet Explorer 8、Firefox 3.6.9+、Chrome 4.1.249.1042+、Safari 4+ 和 Opera 10.50+ 等。现在主流的游览器都已经支持。 能在所有的 web 服务端预先设定好 `X-Frame-Options` 字段值是最理想的状态。 当然版本不支持的以及其不放心时可以参考[这篇文章](https://www.cnblogs.com/bella-lin/p/9266994.html) ### 第二小节 X-XSS-Protection 字段 ```http X-XSS-Protection: 1 ``` 首部字段 `X-XSS-Protection` 属于 HTTP 响应首部,它是针对跨站脚本攻击(XSS)的一种对策,用于控制游览器 `XSS` 防护机制的开关。 首部字段 `X-XSS-Protection` 可指定的字段值如下: * 0:将 `XSS` 过滤设置成无效状态 * 1:将 `XSS` 过滤设置成有效状态 ### 第三小节 DNT 字段 ```http DNT: 1 ``` 首部字段 `DNT` 属于HTTP 请求首部,其中 `DNT` 是 `Do Not Track` 的简称,意为拒绝个人信息被手机,是表示拒绝被精准广告追踪的一种方法。 首部字段 `DNT` 可指定的字段值如下。 * 0:同意被追踪 * 1:拒绝被追踪 由于首部字段 `DNT` 的功能具备有效性,所以 web 服务器需要对 `DNT` 做出对应的支持。 ### 第四小节 P3P字段 ```http P3P: CP="CAO DSP LAW CURa ADMa DEVa TAIa PSAa PSDa IVAa IVDa OUR BUS IND UNI COM NAV INT" ``` 首部字段 `P3P` 属于HTTP响应首部,通过利用P3P ( The Platform for Privacy Preferences,在线隐私偏好平台)技术,可以让Web网站上 的个人隐私变成种仅供程序可理解的形式, 以达到保护用户隐私的 目的。 要进行 `P3P`的设定,需按以下步骤进行。 * 步骤一:创建 `P3P` 隐私 * 步骤二:创建 `P3P` 隐私对照文件后,保存命名在 `/w3c/p3p.xml` * 步骤三:从 `P3P` 隐私中新建 `Compact policies` 后,输出到 HTTP 响应中 关于 `P3P` 的详细规范请查看下面链接。 https://www.w3.org/TR/P3P/ > 作者:肖鹏-SpiritLing 时间:2019-01-30