我相信你是一个误解PHP会话如何工作。您可以安全地将用户名,登录状态和其他内容存储到$_SESSION
阵列中,因为这是存储在服务器端的。发送给浏览器的唯一东西是一个单独的cookie(名为PHPSESSID,除非您在php.ini
中进行了更改)包含会话ID - 这是一个唯一的随机数。
一旦访问者每次请求顶部有session_start()
的页面,session_start()
都会查看名为PHPSESSID的Cookie的请求,请阅读serverside会话文件(如果会话存在并且有效)并恢复提交的$_SESSION
阵列。这个数组永远不需要离开服务器。
会话Cookie设置为没有过期日期(除非您在php.ini中混淆session.cookie_lifetime
选项),因此浏览器在关机时将其删除。服务器上的会话文件本身具有到期时间,由session.gc_maxlifetime
管理(以秒为单位)。
路径安全会议:
- 要保证在使用Cookie的会话ID传递到浏览器设置
session.use_cookies=1
,session.use_only_cookies = 1
,session.use_trans_id = 0
(饶你替代语法的细节)
- 防止会话劫持(即别人伪造现有会话)存储到$ _SESSION一些标识浏览器 - 一个常见的模式是存储在浏览器的User-Agent头的
md5()
,该Accept头,远程IP地址或组合那些;检查它是否在与现有的会话ID为每个新请求匹配
- 如果你是一个共享的服务器上,你确实应该让您的会议文件,从这些服务器邻居分开:设置
session.save_path
到一个文件夹只有你和PHP访问至。
最后,你应该创建一个脚本来将用户登出会话(并鼓励他们使用它而不是简单的导航)。这是一个示例脚本:
<?php
session_start();
$params = session_get_cookie_params();
setcookie(session_name(), '', 1, $params['path'], $params['domain'], $params['secure'], isset($params['httponly']));
session_regenerate_id(true);
session_destroy();
session_write_close();
header('Location: your_login_page.php');
exit;
来源
2010-09-04 19:43:29
djn
我不明白你的代码片段究竟你在做什么。 – 2010-09-04 11:08:36
我将$ data数组传递给会话,以便它创建一个cookie。但是这看起来并不安全,我想知道如何让它安全...... – networkprofile 2010-09-04 11:27:54