Http和Https下的cookie的写入问题

clipboard.png这个是网上找的资料,但是我自己写了一个代码,放在linux下,任然可以在http下获得session,代码如下
ini_set('session.cookie_secure', 1);
ini_set('session.cookie_httponly', 1);
$_SESSION['token']='sdfdsfds';
var_dump($_SESSION);
//可以获取session的值
按照网上的说法应该设置不了session,但是实际却是可以获取,求解答,谢谢!

阅读 7.3k
2 个回答

之所以你能获取到,因为SESSION在当前上下文是存在的。

你这里服务器设置了COOKIE,但是COOKIE还没有发送给客户端,HTTP协议中会在返回的HEADER通过SET-COOKIE告诉客户端当前服务端需要本地写入哪些COOKIE,这中间就存在你问题所提出的客户端根据当前是HTTP还是HTTPS选择是否可接受COOKIE写入,默认情况下都能接受。
你客户端第二次访问服务器会带上本地的有效COOKIE在HTTP头中,若之前返回的COOKIE没有被接受那么自然服务器就获取不到COOKIE了。

你可以试试

var_dump($_SESSION);

ini_set('session.cookie_secure', 1);
ini_set('session.cookie_httponly', 1);
$_SESSION['token']='sdfdsfds';
var_dump($_SESSION);

如果HTTP访问,则第一次的var_dump会没有值。

参考下:

  1. PHP Session 原理

http://blog.csdn.net/whq19890...

https://www.cnblogs.com/luozh...
https://stackoverflow.com/que...

session和cookie是不一样的
session存储在服务器,cookie存储在客户端

设置cookie:
function setcookie ($name, $value = null, $expire = null, $path = null, $domain = null, $secure = null, $httponly = null) {}
获取cookie:
$_COOKIE[$sCookieName];

题主的写法只是操作了服务器端的session,并没有向浏览器发送cookie
session.cookie_secure 使得cookie是否可以通过https传输,改向设置为1则仅可以通过https传输cookie
session.cookie_httponly 使得cookie是否可以被客户端js等进行操作,该项设置为1则仅能够通过http请求访问cookie

====================更新===================
测试了题主的写法,session需要cookie来保存会话id,如果配置禁止了http写cookie的权限的话
那么每次交互响应头都会发送set-cookie命令,且会话id每次都会重新生成
而由于当前请求内$_SESSION是超全局变量,其内容在当前上下文是存在的,所以是可以正确获取到的
并且客户端和服务器交互请求头会发送sessionid来唯一识别本次会话,如果客户端不能够存储cookie
则服务器不能够查找到当前交互设置的session,也就是说当前请求设置的session仅存在于当前上下文,
下一个请求到来时,由于请求头没有携带上次会话的sessionid,就无法识别相应的session,上次请求设置的session相当于不存在,由于服务器端session存储在文件中,那么每次交互都会在session.save_path产生新的sess_j9pul3sdggncaas6luc4cild95文件,这样会耗尽服务器资源

clipboard.png

clipboard.png

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Microsoft
子站问答
访问
宣传栏