PHP Cookie是什么

Cookie 是在 HTTP 协议下,服务器或脚本用来维护客户端上信息的一种方式。Cookie 是由 Web 服务器保存在用户浏览器(客户端)上的小文本文件,它可以包含有关用户的信息。无论何时用户链接到服务器,Web 站点都可以访问 Cookie 信息。

有些 Cookie 是临时的,有些则是持续的。临时的 Cookie 只在浏览器上保存一段规定的时间,一旦超过规定的时间,该 Cookie 就会被系统清除。

持续的 Cookie 则保存在用户的 Cookie 文件中,下一次用户返回时,仍然可以对它进行调用。在 Cookie 文件中保存 Cookie,有些用户担心 Cookie 中的用户信息被一些别有用心的人窃取,而造成一定的损害。

其实,网站以外的用户无法跨过网站来获得 Cookie 信息。如果因为这种担心而屏蔽 Cookie,肯定会因此拒绝访问许多站点页面。因为,当今有许多 Web 站点开发人员使用 Cookie 技术,例如 Session 对象的使用就离不开 Cookie 的支持。

Cookie 的主要用途

服务器可以利用 Cookie 包含信息的任意性来筛选并维护这些信息,以判断 HTTP 传输中的状态。Cookie 最典型的应用是判定注册用户是否已经登录网站,同时用户可能也会得到提示,是否在下一次进入此网站时保留用户信息以便简化登录手续,这些都是 Cookie 的功用。

另一个重要应用场合就是商城类网站的“购物车”功能。用户可能会在一段时间内在同一家网站的不同页面中选择不同的商品,这些信息都会写入 Cookie,以便在最后付款时提取信息。

Cookie 的生命周期

Cookie 可以保持登录信息到用户下次与服务器的会话,换句话说,下次访问同一网站时,用户会发现不必输入用户名和密码就已经登录了(当然,如果手动删除 Cookie 就需要重新登陆了)。而还有一些 Cookie 在用户退出会话的时候就被删除了,这样可以有效保护个人隐私。

Cookie 在生成时就会被指定一个 Expire 值,这就是 Cookie 的生存周期,在这个周期内 Cookie 有效,超出这个周期 Cookie 就会被清除。有些页面将 Cookie 的生存周期设置为“0”或负值,这样在关闭浏览器时,就会马上清除 Cookie,不会记录用户信息,更加安全。

Cookie 的识别功能

如果在一台计算机中安装多个浏览器,每个浏览器都会在各自独立的空间存放 Cookie。因为 Cookie 中不但可以确认用户,还能包含计算机和浏览器的信息,所以一个用户用不同的浏览器登录或者用不同的计算机登录,都会得到不同的 Cookie 信息,另一方面,对于在同一台计算机上使用同一浏览器的多个用户,Cookie 不会区分他们的身份,除非他们使用不同的用户名登录。

脚本攻击

尽管 Cookie 没有病毒那么危险,但它仍包含了一些敏感信息,比如用户名、计算机名等,使用的浏览器和曾经访问的网站。用户不希望这些内容泄漏出去,尤其是当其中还包含有私人信息的时候。

这并非危言耸听,一种名为跨站脚本攻击(Cross site scripting)的方式就可以达到此目的。通常跨站脚本攻击往往利用网站漏洞在网站页面中植入脚本代码或网站页面引用第三方法脚本代码,均存在跨站脚本攻击的可能,在受到跨站脚本攻击时,脚本指令将会读取当前站点的所有 Cookie 内容(已不存在 Cookie 作用域限制),然后通过某种方式将 Cookie 内容提交到指定的服务器(如:AJAX)。一旦 Cookie 落入攻击者手中,它将会重现其价值。

建议开发人员在向客户端 Cookie 输出敏感的内容时,要注意以下几点(譬如:该内容能识别用户身份):
  • 设置 Cookie 不能被脚本读取,这样在一定程度上可以解决上述问题;
  • 对 Cookie 内容进行加密,在加密前嵌入时间戳,保证每次加密后的密文都不一样(并且可以防止消息重放);
  • 客户端请求时,每次或定时更新 Cookie 内容(即重新加密);
  • 每次向 Cookie 写入时间戳,数据库需要记录最后一次时间戳(防止 Cookie 篡改,或重放攻击);
  • 客户端提交 Cookie 时,先解密然后校验时间戳,时间戳若小于数据数据库中记录,即意味发生攻击。

基于上述建议,即使 Cookie 被窃取,却因 Cookie 被随机更新,且内容无规律性,攻击者无法加以利用。另外利用了时间戳另一大好处就是防止 Cookie 篡改或重放。