在php中安全会话/ cookie

时间:2010-09-04 11:00:25

标签: php session cookies

我对会话有疑问。你如何建立一个安全的登录会话/ cookie。 我在看这个例子,他们将这个数组添加到会话中:

$data = array{

    username = $_POST['username'];
    is_logged = true;

}

我想知道这是否足够?是不是可以将cookie中的用户名更改为任何内容或任何人?有什么好办法可以解决这个问题?

或者这是完全安全的,我错过了什么?

另外,你们怎么看待在数据库中存储会话?我知道CI有一个内置功能来做到这一点。这是否会导致性能方面的任何问题,还是值得一试?

2 个答案:

答案 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(以秒为单位)管理。

更安全会话的途径:

  • 确保只使用Cookie将会话ID传递给浏览器设置session.use_cookies=1session.use_only_cookies = 1session.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;

答案 1 :(得分:0)

是的,这是一种非常不安全的方法,如果你想阻止会话劫持,不应该在任何地方使用。

更健壮的方法是在用户登录时为用户生成唯一的会话ID(例如,哈希),并将会话与此ID服务器端相关联。然后仅将cookie中的此会话ID发送回客户端。当客户端使用cookie发送请求时,您将获取会话ID并恢复用户名以及与其相关的任何其他信息以进行请求处理。

客户端可以访问cookie中的会话ID,但是这个值对他来说没有意义,因为他无法从中推断出任何信息,发送随机会话ID几乎没有成功的机会。