转载cookie 和cession

1. PHP 的COOKIE

cookie
是一种在远程浏览器端储存数据并以此来跟踪和识别用户的机制。 
    PHP 在http
协议的头信息里发送cookie,因此  setcookie()    
函数必须在其它信息被输出到浏览器 
前调用,这和对  header()    函数的限制类似。

1.1 设置cookie:

可以用 setcookie()或 setrawcookie()函数来设置
cookie。也可以通过向客户端直接发送http  头来 
设置。 
   
1.1.1  使用 setcookie()函数设置cookie: 
bool setcookie ( string name [,
string value [, int expire [, string path [, string domain [, bool secure [,
bool 
httponly]]]]]] ) 
   name: cookie
变量名 
   value: cookie 变量的值 
   expire:
有效期结束的时间 
   path: 有效目录 
   domain:
有效域名,顶级域唯一 
   secure: 如果值为 1,则cookie 只能在https 连接上有效,如果为默认值
0,则http 和 https 都可 
以。 
例子:

代码片段 
   <?php 
    $value =
‘something from somewhere‘;

setcookie("TestCookie", $value); /* 简单 cookie设置
*/ 
    setcookie("TestCookie", $value, time()+3600); /*
有效期 1个小时 */ 
    setcookie("TestCookie", $value,
time()+3600, "/~rasmus/",

".example.com", 1); /* 有效目录 /~rasmus,有效域名
example.com及其所有子域名 
    */ 
   
?>

设置多个 cookie  变量:setcookie(‘var[a]‘,‘value‘); 
用数组来表示变量,但他的下标不用引号。这 
样就可以用$_COOKIE[‘var’][‘a’]来读取该COOKIE 变量。

1.1.2.  使用
header()设置cookie; 
    header("Set-Cookie:
name=$value[;path=$path[;domain=xxx.com[;...]]"); 
   
后面的参数和上面列出 setcookie 函数的参数一样。 
    比如:

代码片段 

    $value = ‘something from
somewhere‘; 
   header("Set-Cookie:name=$value");

1.2 Cookie 的读取:

直接用php  内置超级全局变量$_COOKIE
就可以读取浏览器端的cookie。 
    上面例子中设置了cookie
"TestCookie",现在我们来读取:

代码片段 
   print
$_COOKIE[‘TestCookie‘];

COOKIE 是不是被输出了?!

1.3  删除cookie

只需把有效时间设为小于当前时间,和把值设置为空。例如:

代码片段

setcookie("name", "", time()-1);

用header()类似。

1.4  常见问题解决:

1) 用
setcookie()时有错误提示,可能是因为调用setcookie()前面有输出或空格。也可能你的文 
      
档是从其他字符集转换过来,文档后面可能带有 BOM
签名(就是在文件内容添加一些隐藏 
       的BOM
字符)。解决的办法就是使你的文档不出现这种情况。还有通过使用ob_start()函数 
      
也能处理一点。 
    2) $_COOKIE 受magic_quotes_gpc
影响,可能自动转义。 
    3) 使用的时候,有必要测试用户是否支持cookie。

1.5 cookie 工作机理:

有些学习者比较冲动,没心思把原理研究,所以我把它放后面。 
   
a) 服务器通过随着响应发送一个http 的Set-Cookie
头,在客户机中设置一个cookie(多个cookie 
要多个头)。 
    b)
客户端自动向服务器端发送一个http 的cookie 头,服务器接收读取。 
    HTTP/1.x 200
OK 
    X-Powered-By:
PHP/5.2.1 
    Set-Cookie: TestCookie=something from
somewhere; path=/ 
    Expires: Thu, 19 Nov 2007 18:52:00
GMT 
    Cache-Control: no-store, no-cache,
must-revalidate, post-check=0, pre-check=0 
    Pragma:
no-cache 
    Content-type: text/html

这一行实现了cookie 功能,收到这行后

Set-Cookie: TestCookie=something from somewhere;
path=/ 

    浏览器将在客户端的磁盘上创建一个cookie 文件,并在里面写入:

TestCookie=something from
somewhere; 
    /

这一行就是我们用 setcookie(‘TestCookie‘,‘something  
from  somewhere‘,‘/‘); 的结果。也就是用 
header(‘Set-Cookie:
TestCookie=something from somewhere; path=/‘);的结果。

2. PHP 的SESSION

session 使用过期时间设为0 的cookie,并且将一个称为session ID
的唯一标识符(一长串字符串), 
在服务器端同步生成一些 session 文件(可以自己定义 session
的保存类型),与用户机关联起来。web 
应用程序存贮与这些 session
相关的数据,并且让数据随着用户在页面之间传递。 
    访问网站的来客会被分配一个唯一的标识符,即所谓的
SESSION                      
ID。它要么存放在客户端的 
cookie,要么经由  URL 
传递。 
    SESSION
允许用户注册任意数目的变量并保留给各个请求使用。当来客访问网站时,PHP  会自 
动(如果  
session.auto_start 被设为   1 )或在用户请求时(由  
session_start()       
明确调用或 
session_register() 暗中调用)检查请求中是否发送了特定的SESSION
ID。如果是,则之前保存的环 
境就被重建。

2.1 SESSION ID 的传送

2.1.1 通过 cookie 传送 SESSION ID 
   
使用 session_start()调用 session,服务器端在生成session 文件的同时,生成 session ID
哈希值和 
默认值为PHPSESSID 的session name,并向客户端发送变量为(默认的是)PHPSESSID(session
name), 
值为一个 128 位的哈希值。服务器端将通过该 cookie
与客户端进行交互。 
    session 变量的值经php 
内部序列化后保存在服务器机器上的文本文件中,和客户端的变量名默 
认情况下为PHPSESSID 的coolie
进行对应交互。 
    即服务器自动发送了
http          
头:header(‘Set-Cookie:  session_name()=session_id();  path=/‘);
即 
setcookie(session_name(),session_id()); 
   
当从该页跳转到的新页面并调用session_start()后,PHP 将检查与给定ID 相关联的服务器端存贮 
的session
数据,如果没找到,则新建一个数据集。 
    2.1.2 通过 URL 传送 session
ID 
    只有在用户禁止使用cookie 的时候才用这种方法,因为浏览器cookie
已经通用,为安全起见, 
可不用该方法。 
    <a
href="p.php?<?php print session_name() ?>=<?php print session_id()
?>">xxx</a>,也可以通过 
POST 来传递 session 值。

2.2 session 基本用法实例

代码片段 
    <?php 
    //
page1.php 
   
session_start(); 
    echo ‘Welcome to page #1‘;

/* 创建 session变量并给 session变量赋值
*/ 

    $_SESSION[‘favcolor‘] =
‘green‘; 
    $_SESSION[‘animal‘] =
‘cat‘; 
    $_SESSION[‘time‘] = time();

// 如果客户端使用 cookie,可直接传递
session到page2.php 
   echo ‘<br /><a
href="page2.php">page 2</a>‘;

// 如果客户端禁用 cookie 
   echo ‘<br
/><a href="page2.php?‘ . SID . ‘">page
2</a>‘; 
    /*

默认php5.2.1下,SID只有在 cookie被写入的同时才会有值,如果该
session 
    对应的 cookie 已经存在,那么 SID将为
(未定义)空 
    */ 
    ?>

代码片段 
   <?php 
    //
page2.php 
    session_start();

print $_SESSION[‘animal‘]; // 打印出单个
session 
   var_dump($_SESSION); // 打印出page1.php传过来的
session值 
    ?>

2.3  使用session 函数控制页面缓存

很多情况下,我们要确定我们的网页是否在客户端缓存,或要设置缓存的有效时间,比如我们 
的网页上有些敏感内容并且要登录才能查看,如果缓存到本地了,可以直接打开本地的缓存就可以 
不登录而浏览到网页了。 
   
使用 session_cache_limiter(‘private‘);可以控制页面客户端缓存,必须在
session_start()之前调用。 
    更多参数见http://blog.chinaunix.net/u/27731/showart.php?id=258087 
的客户端缓存控制。 
    控制客户端缓存时间用
session_cache_expire(int); 
单位(s)。也要在session_start()前调用。 
    这只是使用 session
的情况下控制缓存的方法,我们还可以在header()中控制控制页面的缓存。

2.4  删除session

要三步实现。

代码片段 
   <?php

session_destroy();      // 第一步:
删除服务器端 session文件,这使用 
   
setcookie(session_name(),‘‘,time()-3600);      // 
第 二 步 : 删 除 实 际 的 
    session:

$_SESSION = array();     // 第三步:
删除$_SESSION全局变量数组 
    ?> 

2.5 session
在PHP 大型web 应用中的使用

对于访问量大的站点,用默认的 session 
存贮方式并不适合,目前最优的方法是用数据库存取 
session。这时,函数bool session_set_save_handler (
callback open, callback close, callback read, callback 
write, callback
destroy, callback gc )就是提供给我们解决这个问题的方案。 
    该函数使用的6
个函数如下: 
    1.  bool open()
用来打开会话存储机制。 
    2.  bool close()
关闭会话存储操作。 
    3.  mixde read() 从存储中装载session
数据时使用这个函数。 
    4.  bool write() 将给定 session ID
的所有数据写到存储中。 
    5.  bool destroy() 破坏与指定的 session
ID 相关联的数据。 
    6.  bool gc()
对存储系统中的数据进行垃圾收集。 
    例子见php 手册
session_set_save_handler() 函数。 
    如果用类来处理,用

代码片段 
   
session_set_save_handler(

array(‘className‘,‘open‘), 
     
array(‘className‘,‘close‘), 
     
array(‘className‘,‘read‘), 
     
array(‘className‘,‘write‘), 
     
array(‘className‘,‘destroy‘), 
     
array(‘className‘,‘gc‘), 
    )

调用className 类中的 6 个静态方法。className
可以实例化对象就不用调用静态方法,但是用 
    静态成员不用生成对象,性能更好。

2.6  常用session 函数:

bool session_start(void) 初始化
session。 
    bool session_destroy(void) 删除服务器端 session
关联文件。 
    string session_id() 当前session
的id。 
    string session_name() 当前存取的session
名称,也就是客户端保存session ID 的cookie
名称.默 
认PHPSESSID。 
    array
session_get_cookie_params() 与这个session 相关联的 session
的细节。 
    string session_cache_limiter() 控制使用 session
的页面的客户端缓存。 
    ini session_cache_expire()
控制客户端缓存时间。 
    bool session_destroy() 删除服务器端保存 session
信息的文件。 
    void session_set_cookie_params  
(   int   lifetime   [,  
string   path   [,   string  
domain   [,   bool   secure  
[,   bool 
httponly]]]] ) 设置与这个session 相关联的 session
的细节。 
    bool session_set_save_handler ( callback open,
callback close, callback read, callback write, callback 
destroy,
callback gc ) 定义处理session 的函数(不是使用默认的方式)。 
    bool
session_regenerate_id([bool delete_old_session]) 分配新的session id

2.7 session 安全问题

攻击者通过投入很大的精力尝试获得现有用户的有效 session ID,有了session
id,他们就有可能 
能够在系统中拥有与此用户相同的能力。 
   
因此,我们主要解决的思路是效验session ID 的有效性。

代码片段 
   <?php

if(!isset($_SESSION[‘user_agent‘])){

$_SESSION[‘user_agent‘] = $_SERVER[‘REMOTE_ADDR‘] .

$_SERVER[‘HTTP_USER_AGENT‘];

}

/* 如果用户 session ID是伪造 */

elseif ($_SESSION[‘user_agent‘] !=
$_SERVER[‘REMOTE_ADDR‘] .

$_SERVER[‘HTTP_USER_AGENT‘]) {

session_regenerate_id();

}

?>

2.8 Session 通过cookie 传递和通过SID 传递的不同

在 php5.2.1  的session  的默认配置的情况下,当生成session 
的同时,服务器端将在发送header 
set-cookie 同时生成预定义超级全局变量 SID(也就是说,写入
cookie             
和抛出 SID   是等价的),当 
$_COOKIE[‘PHPSESSID‘]存在以后,将不再写入
cookie,也不再生成超级全局变量SID,此时,SID 
将是空的。

2.9 session 使用实例

代码片段 
   <?php 
    /**

* 效验 session的合法性 
   

    */ 
    function
sessionVerify() { 
      
if(!isset($_SESSION[‘user_agent‘])){ 
          
$_SESSION[‘user_agent‘] =
MD5($_SERVER[‘REMOTE_ADDR‘] 
          
.$_SERVER[‘HTTP_USER_AGENT‘]); 
      
}

/* 如果用户 session ID是伪造,则重新分配 session ID
*/ 
       elseif
($_SESSION[‘user_agent‘]!=MD5($_SERVER[‘REMOTE_ADDR‘] 
      
. $_SERVER[‘HTTP_USER_AGENT‘]))

           
session_regenerate_id(); 
      

    } 

 /**

* 销毁 session 
    *
三步完美实现,不可漏 
    * 
   
*/ 
    function sessionDestroy()

       
session_destroy(); 
       
setcookie(session_name(),‘‘,time()-3600); 
       
$_SESSION = array(); 
    } 
   
?>

注明: 
  session 出现头信息已经发出的原因与cookie 一样。 
 
在php5  中,所有php     session 
的注册表配置选项都是编程时可配置的,一般情况下,我们是不用 
修改其配置的。要了解php 的session 注册表配置选项,请参考手册的
Session 会话处理函数处。

转载cookie 和cession,布布扣,bubuko.com

时间: 2024-11-06 16:22:49

转载cookie 和cession的相关文章

转载-cookie和session的窃取

一.cookie的基本特性 如果不了解cookie,可以先到 wikipedia 上学习一下. http request 浏览器向服务器发起的每个请求都会带上cookie: GET /index.html HTTP/1.1 Host: www.example.org Cookie: foo=value1;bar=value2 Accept: */* http response 服务器给浏览器的返回可以设置cookie: HTTP/1.1 200 OK Content-type: text/htm

转载:细说Cookie

细说Cookie 转载:http://www.cnblogs.com/fish-li/archive/2011/07/03/2096903.html 阅读目录 开始 Cookie 概述 Cookie的写.读过程 使用Cookie保存复杂对象 Js中读写Cookie Cookie在Session中的应用 Cookie在身份验证中的应用 Cookie的安全状况 如何在C#发请的请求中使用Cookie 重构与使用总结 补充 Cookie虽然是个很简单的东西,但它又是WEB开发中一个很重要的客户端数据来

javaweb学习总结——使用Cookie进行会话管理(转载)

javaweb学习总结--使用Cookie进行会话管理(转载) 一.会话的概念 会话可简单理解为:用户开一个浏览器,点击多个超链接,访问服务器多个web资源,然后关闭浏览器,整个过程称之为一个会话. 有状态会话:一个同学来过教室,下次再来教室,我们会知道这个同学曾经来过,这称之为有状态会话. 二.会话过程中要解决的一些问题? 每个用户在使用浏览器与服务器进行会话的过程中,不可避免各自会产生一些数据,程序要想办法为每个用户保存这些数据. 三.保存会话数据的两种技术 3.1.Cookie Cooki

【转载】Cookie/Session机制详解

[本文转自]http://blog.csdn.net/fangaoxin/article/details/6952954/ 会话(Session)跟踪是Web程序中常用的技术,用来跟踪用户的整个会话.常用的会话跟踪技术是Cookie与Session.Cookie通过在客户端记录信息确定用户身份,Session通过在服务器端记录信息确定用户身份. 本章将系统地讲述Cookie与Session机制,并比较说明什么时候不能用Cookie,什么时候不能用Session. 1.1  Cookie机制 在程

javascript删除Cookie的正确方法(转载)

原来一直以为只要设置javascript的document.cookie对象就能简单的在浏览器端设置和删除cookie值,网上很多文章也是这么教的,但是最近发现简单的设置javascript的document.cookie的值无法完全做到删除或更改cookie.偶然发现了一篇文章给出了正确的方法,这里贴出来. 使用JavaScript清理Cookie首先要找到该Cookie对应的Name对应的值,然后设置其为过期: 找到Cookie有下面方法: function getCookie2(name)

Iframe和Frame中实现cookie跨域的方法(转载)

在Iframe和Frame中默认是不支持Cookie跨域的,但通过设置P3P协议相关的响应头可以解决这一问题.关于p3p协议: P3P: Platform for Privacy Preferences(隐私偏好平台).隐私偏好平台(P3P)是允许网络站点来宣告它们收集的关于浏览用户他们的意向使用的信息的一个协议.原意是当用户浏览时,授予用户他们个人信息的更多控制. P3P是万维网联盟(W3C)公布的一项隐私保护推荐标准,旨在为网上冲浪的 Internet用户提供隐私保护.现在有越来越多的网站在

cookie 和session 的区别详解(转载)

原文出处:http://www.cnblogs.com/shiyangxt/archive/2008/10/07/1305506.html 这些都是基础知识,不过有必要做深入了解.先简单介绍一下. cookie机制采用的是在客户端保持状态的方案,而session机制采用的是在服务器端保持状态的方案.同时我们也看到,由于采用服务器端保持状态的方案在客户端也需要保存一个标识,所以session机制可能需要借助于cookie机制来达到保存标识的目的,但实际上它还有其他选择. cookie机制.正统的c

JSP中取COOKIE中指定值得方法【转载】

Cookie cookies[]=request.getCookies(); //读出用户硬盘上的Cookie,并将所有的Cookie放到一个cookie对象数组里面 Cookie sCookie=null; for(int i=0;i<cookies.length-1;i++){    //用一个循环语句遍历刚才建立的Cookie对象数组 sCookie=cookies[i];   //取出数组中的一个Cookie对象 if(sCookie!=null){       if(("cook

对session和cookie的一些理解(转载)

---恢复内容开始--- 文章出处:http://www.blogjava.net/cheneyfree/archive/2007/05/26/120168.html 虽然代码例子用的是JSP,但分析的十分详细. 由于项目需要,最近用session容器比较多,传载的同时加上了自己的一些理解,不足之处还请大家补充和纠正.一.cookie机制和session机制的区别 ******************************************************************