由于http是无状态的,也就是服务器不认识客户端,要让他们认识,于是产生了session(用一个id标明用户身份)。
同样,由于http是无状态的,有时服务器想在客户端存储点信息,于是产生了cookie。
cookie可以通过客户端js读取写入,也可以通过服务器端在http响应头中设置,同时下次访问该服务器时会自动读取这些cookie并放到http请求头中。
1、session是用sessionid来标示用户的,而这个sessionid必须在每次客户端请求服务器时告知,联想到cookie,自然最好的方式就是用cookie来保存sessionid咯。当然有各种替代方式传递sessionid如url重写加参数。
2、php.ini中的所有session相关的配置以及带cookie相关的配置都是关于session以及sessionid这个cookie变量的设置,而不是全局cookie的设置!setcookie与session半毛钱关系没有,只是session_start时会自动产生一个sessionid的cookie(如果请求头中没有sessionid)!setcookie的所有参数都必须在调用时指定,setcookie的函数原型:
expires为0,则代表浏览器关闭时这个cookie就失效。setcookie ( string $name, string $value, int $expire = 0, string $path, string $domain, bool $secure = false, bool $httponly = false)
3、由于cookie可以用客户端js读取,拿到内容后就可以模拟http请求头达到欺骗服务器的目的,也成了安全的一大隐患。幸好,cookie变量有个httponly属性,主流的浏览器都支持,包括ie。
所谓httponly的cookie变量,就是不允许本地js读取的cookie变量,(注:这里的cookie指的是一个cookie变量,不是cookie文件),但是这些值还是通过工具可以看到。
这样做有一个好处,就是可以预防简单的xss攻击,因为通过注入js将document.cookie传出去的时候httponly的cookie变量是拿不到的。
php.ini设置中有个session.cookie_httponly,将这个值设置为1,会将sessionid这个cookie变量设置为httponly,但是对于setcookie函数生成的cookie则不起作用!
setcookie函数调用必须将最后一个参数设置为true。
将session.cookie_httponly设置为1,并参考下面代码:
运行结果:<?php
session_start();
setcookie('test6', 'kkk2');
setcookie('test7', 'kkk3', NULL, NULL, NULL, NULL, TRUE);
?>
<html>
<head>
<script type="text/javascript">
var cookie = document.cookie;
console.log(cookie);
</script>
</head>
</html>
关于php session相关的文章,推荐几篇
php深入浅出session
PHP5 session 详解【经典】