您当前的位置:首页 > 网站建设笔记 >

PHP cookie详解

0

使用 cookie

在会话出现以前,曾经大量使用cookie。cookie实际上就是一些文件,通过Web应用程序写到用户计算机上的一个临时文件中。cookie存储了可以由在线应用程序读取的信息,从而能够将用户认证为唯一用户。通过允许Web应用程序识别一个用户是否唯一,应用程序就可以执行登录脚本和其他功能。

cookie存在一个问题,因为它们存储在用户的计算机上,所以这已经成为一个极不安全的漏洞。另外,由于cookie存在这种不安全性,用户已经开始在浏览器安全设置中将cookie关闭(禁用)。实际上,用户一般都不接受cookie。

如果开发人员能正确使用,cookie本身并不坏,也并非不安全。不过,由于用户能禁用cookie(而且具体的cookie必须存储在用户计算机上),所以大多数优秀的开发人员都已经将其代码移植为使用会话。不过,对于目前而言,cookie的功能已经足以完成任务了,所以下面的技巧将介绍cookie如何工作。

设置 cookie

为了能使用cookie并在其中存储值,必须先在用户的计算机上设置一个cookie,可以使用许多参数来充分利用cookie,这包括到期时间、使用路径、名称、值等等。通过使用不同的参数,可以自定义cookie采用何种方式工作。设置cookie要使用函数setcookie(),原型如下:

bool setcookie(string name [,string value="" [,int expire=0 [,string path="" [,string domain="" [,bool secure=false [,bool httponly=false]]]]]])

以下表列出了使用setcookie()创建cookie时可用的参数。

PHP 5 setcookie()参数
参数 描述
name 为cookie变量设置的名称,相应地,将利用这个名称来访问cookie变量
value 当前cookie的值
expire

cookie何时到期(采用Unix时间戳形式)

到期时间参数用于设置cookie存在的精确限定的时间长度,用从新纪元(epoch)(新纪元是1970年1月1日0点)起所经过的秒数表示。如果没有设置它或者把它的值设置为0,cookie将持续起作用,直到用户关闭了他或她的浏览器。这些cookie被认为在浏览器会话期间一直存在。

为了设置特定的到期时间,可在当前时刻上增加特定的分钟数或小时数,可以使用time()函数获取当前时刻。下面一行代码将把cookie的到期时间设置为当前时间后30分钟(60秒乘以30分钟):
setcookie(name, value, time()+1800);

path

cookie在哪个目录下可以使用
cookie在哪个域中可以使用

路径(path)和主机(domain/host)这两个参数用于把cookie限制到Web站点内(路径)特定的文件夹,或者限制到特定的主机(www.example.com或192.168.0.1)。例如,你可以把cookie限制为,仅当用户位于域中的admin文件夹(以及admin文件夹的子文件夹)内时才存在:
setcookie(name, value, expire, "/admin");

将路径设置为/将使得cookie在整个域(Web站点)内可见。将域设置为.example.com将使得cookie在整个域和每个子域(www.example.com、admin.example.com、pages.example.com等)内都可见。

domain
secure

cookie在一个未启用SSL的脚本上是否可读

安全(secure)值规定只应该通过安全的HTTPS连接来发送cookie。1指示必须使用安全的连接,0则指示标准连接也不错。
setcookie(name, value, expire, path, host, 1);
如果站点使用安全连接,则限制通过安全的HTTPS连接发送cookie比不这样做要安全得多。

httponly 最后,PHP 5.2中添加了一个httponly参数。使用一个布尔值指示只能通过HTTP(和HTTPS)访问cookie。强制执行这种限制将使用cookie更安全(阻止一些黑客攻击),但是并非所有的浏览器都支持它。
setcookie(name, value, expire, path, domain, secure, true);

与带有参数的所有函数一样,必须按顺序传递setcookie()值。要跳过任何参数,可使用NULL、0或空字符串(不要使用FALSE)。到期时间和安全这两个值都是整数,因此不能用引号括住它们。

删除 cookie

虽然在关闭用户的浏览器时或者在到达到期日期/时间时cookie会自动到期,但是,有时你希望手动删除cookie。例如,在具有登录能力的Web站点内,可能希望在用户注销时删除任何cookie。

尽管setcookie()函数可以带最多7个参数,但是实际上只有一个参数(cookie名称)是必需的。如果发送一个包含名称但没有值的cookie,其效果就相当于删除现有的同名cookie。例如,要创建username cookie,可以使用下面这一行代码:

setcookie("username", "boxnetwork");

要删除username cookie,可以编写如下代码:

setcookie("username");

一种附加的预防措施是,还可以把到期日期设置成过去的某个日期。

setcookie("username", "", time()-3600);
顶部中部底部