会话跟踪技术之COOKIE

会话跟踪技术之COOKIE

一、为什么要用会话控制

我们需要我们的站点可以跟踪客户端与服务器之间的交互,保存和记忆每个用户的身份和信息。

几个疑问

  1. 我先访问A页面后访问B页面,HTTP无法知道是不是同一个人访问
  2. 为什么京东它知道我曾经浏览过哪些商品
  3. 为什么别人可以看到我的网页浏览记录

二、会话跟踪技术

1、使用隐藏表单域

<input type="hidden" name="checkid" value="AK47">

2、借助URL参数

原始URL:http://www.aipanshi.com/show.php
用添加的参数重写的URL:
http://www.aipanshi.com/show.php?id=1002
原始URL:http://www.aipanshi.com/userinfo.php
用添加的参数重写的URL:
http://www.aipanshi.com/userinfo.php?uid=1000

3、Cookie

4、Session

三、会话跟踪技术之COOKIE

1、什么是cookie(小甜品)

  • cookie 是HTTP协议下,服务器或脚本可以维护客户信息的一种方式
  • 用户在浏览器上的一个很小的文本文件。【常用来记忆 用户名、密码、个性化设置、个人偏好记录等等】
  • cookie 保存在客户端(用户浏览器),可以手动删除。如果浏览器上的cookie太多,超过了系统所允许的范围,浏览器会自动删除。

2、cookie的工作原理

存储cookie是浏览器提供的功能。cookie 其实是存储在浏览器中的纯文本,浏览器的安装目录下会专门有一个 cookie 文件夹来存放各个域下设置的cookie

当浏览器不禁用cookies的时候,浏览器每一次的WEB请求,都会自动读取cookies数据发送给服务器。

另一种说法:cookies是服务器保存在客户端上的数据,用来标识用户.

3、生成一个cookie

  • 3.1 通过setcookie()函数
    setcookie('名字','值','有效期','路径','域名','是否安全');
    名字:    取的名字(必须)
    值:    存的什么(必须)
    有效期:    在多长时间内可以访问(必须),默认浏览器关闭即失效
    路径:    可以进哪个文件夹 默认是当前访问的文件夹   注意'/'是根目录
    域名:    相当于区域
    安全:    默认是false如果是使用https协议,就将这一项改为true

    例子

    # 默认创建cookie在浏览器关闭后失效
    
    setcookie('name','jack');q
    
    # 有效时间1个小时
    
    setcookie("english-name",'Jack',time()+3600);
    
    # 在目录session下创建cookie默认的作用域是/session,非/session目录访问不了
    
    setcookie("english-name",'Jack',time()+3600,'/');
    //有效时间1个小时,整个域名下有效,一级域名下有效
    setcookie("english-name-test",'Jack-test',time()+3600,'/','study.com'); 
    //数组方式
    setcookie('name[0]','jack');
    setcookie('name[1]','jack100');
    // 也可以先序列化再存储
    $arr = ['jack','jack2'];
    setcookie('arr-name',serialize($arr));
  • 3.1 通过header()函数
    header("Set-Cookie:course=PHP;path=/;");

4、访问cookie

var_dump($_COOKIE["cookiename"]);

5、删除一个cookie

# 第一种方法
setcookie("cookieName","Value",time()-1);

# 第二种方法
setcookie("cookieName");

5、cookie存放位置

# chrome
C:\Documents and Settings\Administrator\Local Settings\Application Data\Google\Chrome\User Data\Default
下面有个cookie文件,有时候找不到对用的文件夹,可能是系统默认隐藏
# Firefox
C:\Users\Administrator\AppData\Local\Mozilla\Firefox\Profiles\pmfhbcqs.default\OfflineCache

每个浏览器都有自己的cookies文件,每个浏览器也只能读写自己的cookies数据,并且具体的读写处理也不一样。 举个例子,chrome的所有cookies数据是存放在一个文件中的,并且做了加密处理,所以chrome写cookies时会加密,读cookies会解密,如果你用文本处理工具打开chorme的cookies会发现乱码看不懂,就是因为chrome加密了不让你看,只有它自己懂

6、cookie注意事项

  1. setcookie()函数之前不能有任何html输出,空白都不行。同header()
  2. 通过setcookie()函数生成cookie,打印$_COOKIE['name'],不能获取对应的值.必须刷新或在其他页面获取。
  3. 不同浏览器对cookie处理不同。客户端可以禁用cookie,浏览器也会限制cookie的数量。

    一个浏览器能创建的cookie数量最多为300个,并且每个不能超过4KB,每个WEB站点能设置的cookie总数不能超过20个

  4. cookie是保存在客户端。用户可以禁用或删除,所以不能过分依赖cookie。
  5. 不要使用过多,影响网站性能(文件读写)

四、COOKIE数据的加密

<?php
function str_auth($string, $operation = 'ENCODE', $key = '', $expiry = 0) { 
    $ckey_length = 4; 
    $key = md5($key!=''?$key:'www_uxuew_cn'); //加密秘钥
    $keya = md5(substr($key, 0, 16)); 
    $keyb = md5(substr($key, 16, 16)); 
    $keyc = $ckey_length ? ($operation == 'DECODE' ? substr($string, 0, $ckey_length): substr(md5(microtime()), -$ckey_length)) : ''; 

    $cryptkey = $keya.md5($keya.$keyc); 
    $key_length = strlen($cryptkey); 

    $string = $operation == 'DECODE' ? base64_decode(strtr(substr($string, $ckey_length), '-_', '+/')) : sprintf('%010d', $expiry ? $expiry + time() : 0).substr(md5($string.$keyb), 0, 16).$string; 
    $string_length = strlen($string); 

    $result = ''; 
    $box = range(0, 255); 

    $rndkey = array(); 
    for($i = 0; $i <= 255; $i++) { 
        $rndkey[$i] = ord($cryptkey[$i % $key_length]); 
    } 

    for($j = $i = 0; $i < 256; $i++) { 
        $j = ($j + $box[$i] + $rndkey[$i]) % 256; 
        $tmp = $box[$i]; 
        $box[$i] = $box[$j]; 
        $box[$j] = $tmp; 
    } 

    for($a = $j = $i = 0; $i < $string_length; $i++) { 
        $a = ($a + 1) % 256; 
        $j = ($j + $box[$a]) % 256; 
        $tmp = $box[$a]; 
        $box[$a] = $box[$j]; 
        $box[$j] = $tmp; 
        $result .= chr(ord($string[$i]) ^ ($box[($box[$a] + $box[$j]) % 256])); 
    } 

    if($operation == 'DECODE') { 
        if((substr($result, 0, 10) == 0 || substr($result, 0, 10) - time() > 0) && substr($result, 10, 16) == substr(md5(substr($result, 26).$keyb), 0, 16)) { 
            return substr($result, 26); 
        } else { 
            return ''; 
        } 
    } else { 
        return $keyc.rtrim(strtr(base64_encode($result), '+/', '-_'), '='); 
    } 
} 

var_dump(str_auth('jack'));

$string = '0494_qUPiWkv2NluPFEHdqqlimykBHNmnsXd9oTFultD';

var_dump(str_auth($string,'DECODE'));

?>




posted @ 2021-09-05 20:04  成文的博客  阅读(276)  评论(0编辑  收藏  举报