会话跟踪技术之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个


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

四、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'));

?>



 ​