php cookie与session

一. cookie

1.  什么是cookie

   某些网站为了辨别用户身份、由 Web 服务器保存在用户浏览器(客户端)上的小文本文件,它可以包含有关用户的信息。无论何时用户链接到服务器,Web 站点都可以访问 Cookie 信息

2. cookie保存哪里

     保存在浏览器(客户端)

3. 工作原理

      a) 服务器通过随着响应发送一个http 的Set-Cookie 头,在客户机中设置一个cookie(多个cookie要多个头)。 
      b) 客户端自动向服务器端发送一个http 的cookie 头,服务器接收读取

4. 优点

     减轻服务器压力(保存在客户端,要跟踪这个用户,,这个用户的信息,保存在浏览器,,缓存文件。。对应一个网站)

     根据要求保存时间,更改状态

5. 缺点

      伪cookie,伪照,浏览器禁用了,会失效

6. 设置cookie

    1. setcookie()或setrawcookie()函数设置cookie

        bool setcookie ( string name [, string value [, int expire [, string path [, string domain [, bool secure [, bool 
httponly]]]]]] ) 
        SetCookie(名字,值,有效期,有效路径,有效域名,加密的HTTPS协议);
        有效期: 以'秒'为单位   如:time()+3600就是表示一小时后失效 也可以通过mk_time()
        保存目录:限制保存到一个目录  ,默认是当前目录,在另外一目录下没有作用
        域名:.php100.com 泛解析   bbs.php100.com也有用
        secure 如果值为 1,则cookie 只能在https 连接上有效,如果为默认值 0,则http 和 https 都可以。 
        除了'名字',其他参数都是可选的, '值','有效路径','有效域名'可以用空字符替代,'有效期','加密的HTTPS协议'用0表示

    2. 使用 header()设置cookie; 

       header("Set-Cookie: name=$value[;path=$path[;domain=xxx.com[;...]]"); 

7. 获取cookie

   echo $_COOKIE["user"];
   echo $HTTP_COOKIE_VARS['user'];

8. 注销cookie

   1. 调用只带有name的SetCookie: SetCookie('name')
   2. 设置(有效时间小于当前时间)失效时间提前:SetCookie('name','',time()-1)
       当一个COOKIE删除时,在当前页仍然有效

9. 注意事项

    a. 在html输出之前,调用COOKIE函数(因为COOKIE属于HTTP协议头的一部分,用于浏览器跟服务器间传递信息)
    b. 不同的浏览器处理结果不一样
    c. 一个浏览器最多创建30个,一个最大4KB(操作混乱)

    d. cookie不是时时生效的,,要再点击一次(php规定),

         解决办法:增加一个跳转页面  echo "<script>location.href='跳转的页面文件'</script>";

    e. 注意:Cookie一定要在其他Header之前发送出去,否则出错!

10. 实例

a. 设置、清除cookie(请求后,服务器会发送一个响应的set-cookie头给客户端,包含cookie的信息)


   

b.  获取cookie(客户端请求时,会发送一个Cookie请求头,指定cookie名和值,服务器端可以获取)




二. session

1.  什么是session

    简单来说就是服务器给客户端的一个编号。当一台WWW服务器运行时,可能有若干个用户浏览正在运行这台服务器上的网站。当每个用户首次与这台WWW服务器建立连接时,他就与这个服务器建立了一个Session,同时服务器会自动为其分配一个SessionID,用以标识这个用户的唯一身份。

2. session保存哪里

    保存在服务器端

3. 工作原理

    session_start()调用 session,服务器端在生成session 文件时,生成 session ID和默认值为PHPSESSID 的session name.  同时服务务器自动发送了 http头:

header('Set-Cookie:  session_name()=session_id();  path=/'); 即setcookie(session_name(),session_id()); 

创建了一个与SESSION相关联的COOKIE

4. sessionid的传送

     COOKIE传送:  当从该页跳转到的新页面并调用session_start()后,PHP 将检查与给定ID 相关联的服务器端存贮 
                           的session 数据,如果没找到,则新建一个数据集
     URL传送:  只有在用户禁止使用cookie 的时候才用这种方法,因为浏览器cookie 已经通用,为安全起见,可不用该方法。  

                    <a href="p.php?<?php print session_name() ?>=<?php print session_id() ?>">xxx</a>,

                     也可以通过 POST 来传递 session 值。 

4. 优点

      保存在服务器端的, 有专门一个文件保存session,安全性高,保存在服务器端,用户无法修改

5. 缺点

        浏览器关了后,,会注销,不能设置保存时间
每一个用户,生成一个文件,,增大服务器压力

6. session函数

     设置session:

           session_start();

           $_SESSION['test'] = 'TEST';

     获取session:

           session_start();

          echo  $_SESSION['test'];

     注销session:

           session_destroy();

          SetCookie('PHPSESSID','',time()-1);

     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 

7. 注意事项

    session_start()  放在头部任何文件输出之前

8. SESSION 安全问题 

    攻击者通过投入很大的精力尝试获得现有用户的有效 session ID,有了session id,他们就有可能 
能够在系统中拥有与此用户相同的能力。 
因此,我们主要解决的思路是效验session ID 的有效性。 
代码片段 
<?php 
  //$_SERVER['REMOTE_ADDR'] #正在浏览当前页面用户的 IP 地址。
  // $_SERVER['HTTP_USER_AGENT'] #当前请求的 User_Agent: 头部的内容。
  if(!isset($_SESSION['user_agent'])){ 
  $_SESSION['user_agent'] = $_SERVER['REMOTE_ADDR'] . $_SERVER['HTTP_USER_AGENT']; 
  }elseif ($_SESSION['user_agent'] != $_SERVER['REMOTE_ADDR'] . $_SERVER['HTTP_USER_AGENT']) { /* 如果用户 session ID是伪造 */ 
  session_regenerate_id(); 
  } 

?> 

9. 实例

a.  清除session(客户端清除,服务端器清除)




b.  设置session(开启session会话后,会发送一个set-cookie请求头给客户端(PHPSSID为名,值为sessionid的Cookie))




b. 获取session(客户端会发送一个名为PHPSSID,值为sessionid的请求头到服务器端,服务器端可以通过sessionid获取到session值)




三. session与cookie的区别与联系

a.  区别

    1. cookie保存在客户端,安全性低,session保存在服务器端,安全性高

    2. cookie可以设置生存时间,session没有生存周期,但是可以通过cookie设置session生存周期

b. 联系

    如果sessionid默认为cookie保存的话,session会话开启后,会发送一个set-cookie请求头(名为PHPSSID,值为sessionid)给客户端,客户端再次请求后,会带上PHPSSID的cookie,服务器端就根据sessionid就可以获取到session变量

c. 更多区别与联系-可参考:https://blog.csdn.net/duan1078774504/article/details/51912868


猜你喜欢

转载自blog.csdn.net/mengzuchao/article/details/80728113