2010-09-04 141 views
2

我有一个关于会话的问题。你如何做一个安全的登录会话/ cookie。 我一直在寻找在这个例子中,他们这个阵列添加到会话:php中的安全会话/ cookie

$data = array{ 

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

} 

我想知道,这是足够了吗?是不是可以将cookie中的用户名更改为任何人或任何人?这将是一个好方法吗?

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

另外,你们认为如何将会话存储在数据库中?我知道CI有一个内置的功能来做到这一点。这是否会在性能方面造成任何问题,还是值得欢迎?

+1

我不明白你的代码片段究竟你在做什么。 – 2010-09-04 11:08:36

+0

我将$ data数组传递给会话,以便它创建一个cookie。但是这看起来并不安全,我想知道如何让它安全...... – networkprofile 2010-09-04 11:27:54

回答

9

我相信你是一个误解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=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; 
+0

谢谢,你是对的我正在混淆会话与饼干!非常明确的解释! – networkprofile 2010-09-04 21:47:43

0

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

更鲁棒的方法将被生成用于所述用户的唯一的会话ID(例如,散列),当她登录和会话与此ID的服务器端相关联。然后,将cookie中的这个会话ID仅发送回客户端。当客户端使用cookie发送请求时,您可以获取会话ID并为您的请求处理恢复与其关联的用户名和任何其他信息。

客户端访问cookie中的会话ID,但该值是毫无意义的,因为他自己无法从中推断出任何信息,并发送随机会话ID都有成功的机会非常少。

+0

你的意思是我应该例如在发送给cookie的时候在用户ID上应用md5函数,或者我应该使用一些生成哈希时的关键点,以便我可以恢复用户ID?谢谢! – networkprofile 2010-09-04 11:23:17

+0

您应该生成不可预测的内容,否则恶意用户可能会使用不同的用户ID继续生成值并对它们进行散列处理。你可以生成一个形式为[userID] [一些随机数据]的字符串,然后对其进行哈希处理。随机数据可以使用PHP的uniqid()函数生成。这样你会很安全。 – 2010-09-04 11:39:37