我对会话有疑问。你如何建立一个安全的登录会话/ cookie。 我在看这个例子,他们将这个数组添加到会话中:
$data = array{
username = $_POST['username'];
is_logged = true;
}
我想知道这是否足够?是不是可以将cookie中的用户名更改为任何内容或任何人?有什么好办法可以解决这个问题?
或者这是完全安全的,我错过了什么?
另外,你们怎么看待在数据库中存储会话?我知道CI有一个内置功能来做到这一点。这是否会导致性能方面的任何问题,还是值得一试?
答案 0 :(得分:10)
我相信你误解了PHP会话应该如何工作。您可以安全地将用户名,登录状态和其他内容存储到$_SESSION
数组中,因为它存储在服务器端。发送到浏览器的唯一事情是一个cookie(名为PHPSESSID,除非你在php.ini
中更改了它)包含会话ID - 这是一个唯一的随机数。
一旦访问者在每次请求顶部有session_start()
的页面时都有活动会话,session_start()
将查看名为PHPSESSID的cookie的请求,请阅读服务器端会话文件(如果会话存在且有效)并恢复已归档的$_SESSION
数组。这个数组永远不需要离开服务器。
会话cookie的设置没有到期日期(除非你弄乱了php.ini中的session.cookie_lifetime
选项),因此浏览器会在关机时删除它。服务器上的会话文件本身具有过期时间,由session.gc_maxlifetime
(以秒为单位)管理。
更安全会话的途径:
session.use_cookies=1
,session.use_only_cookies = 1
,session.use_trans_id = 0
(我将为您提供备用语法的详细信息)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;
答案 1 :(得分:0)
是的,这是一种非常不安全的方法,如果你想阻止会话劫持,不应该在任何地方使用。
更健壮的方法是在用户登录时为用户生成唯一的会话ID(例如,哈希),并将会话与此ID服务器端相关联。然后仅将cookie中的此会话ID发送回客户端。当客户端使用cookie发送请求时,您将获取会话ID并恢复用户名以及与其相关的任何其他信息以进行请求处理。
客户端可以访问cookie中的会话ID,但是这个值对他来说没有意义,因为他无法从中推断出任何信息,发送随机会话ID几乎没有成功的机会。