Cookie的基本概念和设置

 Cookie在远程浏览器端存储数据并以此跟踪和识别用户的机制。从实现上说,Cookie是存储在客户端上的小段数据,浏览器(即客户端)通过HTTP协议和服务器端进行Cookie交互。

     注意 这里说的是客户端而不是浏览器,实际能管理Cookie的不仅仅是浏览器,当然最常见的是由浏览器管理Cookie,后面的叙述中不再区分这两个概念。
      Cookie独立语言存在,也就是说,不论PHP还是JSP种下的Cookie,其本质都是一样的,客户端脚本(如JavaScript)均能读取到。Cookie并不是由这些语言实现,而这些语言则是实现对Cookie的间接操作,聚聚发送HTTP指令,浏览器收到指令便操作Cookie返回给服务器。因此,Cookie是由于浏览器实现和管理的。关于Cookie的RFC文档主要有:RFC6265、RFC2109。
     举例来说,我们经常使用PHP设置Cookie,但实际上PHP并没有真正设置过Cookie,甚至可以说,PHP根本就没有这个能力设置Cookie。它只是发出命令让浏览器来做这件事而已,形象地说就和“有关部门”打个招呼。了解这个概念,对于后面的学习很重要。
     Cookie主要是参照RFC2109标准实现和客户端之间的交互指令。
     在PHP中可以使用setcookie()或setrawcookie()函数设置Cookie。其函数原型如下:
bool setcookie ( string $name [, string $value [, int $expire = 0 [, string $path [, string $domain [, bool $secure = false [, bool $httponly = false ]]]]]] )
第一个参数是必选参数,其值是Cookie的名称,即$_COOKIE这个全局数组的键值。
第二个参数用来设置Cookie的值。参数值为空时,Cookie值为空。由于把Cookie的值设为false会使客户端尝试删除这个Cookie,所以要在Cookie在保存true或false时不应该直接使用boolean值,而应该用于0表示false,用1表示true,用1表示true。只要愿意,用A表示false, B表示true也是可以的。
第三个用来设置有效时间,以秒为单位。这个值很重要,决定了Cookie的存储方式。
第四个参数用来设置Cookie的有效目录,默认为“/”,即整个域名下有效,如果有需要,可能设置仅在某目录下有效。
第五个参数用来设置Cookie的作用域名,默认域名下。需要注意的是,在IE下,包括点号长度小于等于5的短域名如果带domain参数,会导致Cookie设置失败。
第六个参数用于设置是否对Cookie进行加密传输,默认为false。如果设置true,只有使用HTTPS,这个Cookie才会被设置。所以,通常情况下不设置此参数或使用默认值false。
第七个参数表示是否只使用HTTP访问Cookie。如果1为1或者true,客户端的JavaScript就无法操作这个Cookie。使用此参数可以减少XSS攻击的风险,但注意,不是所有的浏览器都支持这个参数。此参数只在PHP5.2.0以上版本有效。(再次强调,Cookie和PHP没有任何关系,具体的管理由客户端全程完成。)
提示 setrawcookie的功能和参数与setcookie基本一样,唯一区别是setraw-cookie不会对Cookie中的value进行urlencode转码。
设置Cookie时需要注意以下几点:
这个函数一个返回值,如果是false,代表设置失败;如果true,代表设置成功。但是这个返回值仅供参考,不代表客户端一定能接收到。
由于PHP在当前页设置的Cookie不能立即生效,要等到下一个页面才能看到。这是由于设置的这个页面里的Cookie由服务器传递给客户浏览器,在下一个页面浏览器才能把Cookie从客户的机器里取出传回服务器。如果是JavaScript设置的,是立即生效的。
Cookie没有显式的删除函数。如果想删除Cookie,应该将Cookie的expire设置为过期时间,如1小时前、1970年等,这会自动触发浏览器的删除机制。
 
 
Cookie跨域与P3P协议
      正常的Cookie只能在一个应用中共享,即一个Cookie只能由创建它的应用获得。实现Cookie跨域,主要是为了统一应用平台,即实现目前最流行的单点登录。最简单的方式就是使用P3P协议。
      P3P(Platform for Privacy Preferences)协议由万维网协议研制,为Web用户提供了对自己公开信息的更多控制。支持P3P协议的Web站点为浏览者声明它们的隐私策略。支持P3P协议的浏览器将Web站点策略与用户隐私偏好进行对比,并为用户提出不匹配的警告,通知用户有关Web隐私的处理方式。
 
Cookie跨域涉及两个不同的应用,习惯上称为第一方和第三方。
      第一方Cookie来自当前正在查看的网站,或者发送到当前正在查看的网站。
      第三方Cookie来自当前正在查看的网站以外的网站,或者发送到当前正在查看的网站以外的网站。
      第三方网站通常提供正在查看的网站上的内容。例如,许多站点使用来自第三方网站的广告,或者IFAME的别的网站的URL,这些第三方的网站可能使用的Cookie.
      通过P3P使用户自己可以指定浏览器的隐私策略,达到存取第三方Cookie的目的。也许你觉得这跟web应用 毫无关系,真正的问题是如何让服务器指定用户浏览器的隐私策略,这就是P3P的使命,只要在响应用户请求时,在HTTP的头信息中增加相关于P3P的配置信息就可以了,
 

Cookie提要的更多相关文章

  1. Http协议提要

    HTTP协议提要 简单来说,HTTP就是一个基于应用层的通信规范:双方要进行通信,大家就要遵守一个规范---HTTP协议.HTTP协议从WWW服务器超文本到本地浏览器 ,可以使浏览器更加高效.HTTP ...

  2. 超大 Cookie 拒绝服务攻击

    有没有想过,如果网站的 Cookie 特别多特别大,会发生什么情况? 不多说,马上来试验一下: for (i = 0; i < 20; i++) document.cookie = i + '= ...

  3. IE10、IE11 User-Agent 导致的 ASP.Net 网站无法写入Cookie 问题

    你是否遇到过当使用一个涉及到Cookie操作的网站或者管理系统时,IE 6.7.8.9下都跑的好好的,唯独到了IE10.11这些高版本浏览器就不行了?好吧,这个问题码农连续2天内遇到了2次.那么,我们 ...

  4. 解决cookie跨域访问

    一.前言 随着项目模块越来越多,很多模块现在都是独立部署.模块之间的交流有时可能会通过cookie来完成.比如说门户和应用,分别部署在不同的机器或者web容器中,假如用户登陆之后会在浏览器客户端写入c ...

  5. jquery插件的用法之cookie 插件

    一.使用cookie 插件 插件官方网站下载地址:http://plugins.jquery.com/cookie/ cookie 插件的用法比较简单,直接粘贴下面代码示例: //生成一个cookie ...

  6. 一个诡异的COOKIE问题

    今天下午,发现本地的测试环境突然跑不动了,thinkphp直接跑到异常页面,按照正常的排错思路,直接看thinkphp的log 有一条 [ error ] [2]setcookie() expects ...

  7. [转载]Cookie/Session的机制与安全

    Cookie和Session是为了在无状态的HTTP协议之上维护会话状态,使得服务器可以知道当前是和哪个客户在打交道.本文来详细讨论Cookie和Session的实现机制,以及其中涉及的安全问题. 因 ...

  8. jquery.cookie的使用

    今天想到了要为自己的影像日记增加赞的功能,并且需要用到cookie. 记得原生的js操作cookie也不是很麻烦的,但似乎jquery更简单,不过相比原生js,需要额外引入2个文件,似乎又不是很好,但 ...

  9. 跨域问题,前端主动向后台发送cookie

    跨域是什么? 从一个域名的网页访问另一个域名的资源,就会出现跨域.只要协议.端口.域名有一个不同就会出现跨域 例如: 1.协议不同  http://www.baidu.com:80 和 https:/ ...

随机推荐

  1. (28)A practical way to help the homeless find work and safety

    https://www.ted.com/talks/richard_j_berry_a_practical_way_to_help_the_homeless_find_work_and_safety/ ...

  2. OpenGL ES中MRT应用

    Demo涵盖了OpenGL ES 3.0 的一系列新特性: 1.VAO和VBO 2.帧缓冲对象 3.MRT 效果: 代码: //yf's version #define STB_IMAGE_IMPLE ...

  3. oracle 恢复table删除数据 恢复package(使用闪回)

    好久没写东西了,今天写一篇凑个数吧,来公司一年多了,感觉自己到了一个小瓶颈期了. 以前每天很多新东西,都是忙着学,感觉没时间写博客总结一下,大部分都是写笔记,现在又是没东西可以写,每天干着95%都是重 ...

  4. Oracle授权

    给连接权限 grant connect to 用户; 给资源权限 grant resource to 用户; 给DBA权限 grant dba to 用户; 授权语句 --select * from ...

  5. selenium自动化常用函数

    前段时间弄一个测试框架,满足公司简单网站的测试,整合了一个函数模块,包括常用的截图.邮件发送.测试报告生成,具体代码如下 import smtplib from BSTestRunner import ...

  6. grep,sed,awk用法整理

    grep -c 打印出符合要求的行数 -i 忽略大小写              ignore -n 连同符号一起输出          num -v 打印出不符合要求的行 -A2 本行及下面两行 - ...

  7. FPGA跨时钟域握手信号的结构

    FPGA跨时钟数据传输,是我们经常遇到的问题的,下面给出一种跨时钟握手操作的电路结构.先上图 先对与其他人的结构,这个结构最大的特点是使用 req 从低到高或者高到低的变化 来表示DIN数据有效并开始 ...

  8. java实现中缀表达式转后缀表达式

    package postfix; import java.util.Stack; /** * * @author DELL 将中缀表达式转化为后缀表达式 */ public class Express ...

  9. javascript中的replace方法

    1.replace 调用方法str.replace(regexp|substr, newSubStr|function) regexp,正则表达式 substr,需要被替换的字符串 newSubStr ...

  10. [转]Rapidly detecting large flows, sFlow vs. NetFlow/IPFIX

    Figure 1: Low latency software defined networking control loop The articles SDN and delay and Delay ...