登录系统中的PHP会话和cookie

时间:2014-05-07 15:59:32

标签: php session cookies login

我在许多地方读过,例如session_start() creates a cookiesession_start() creates a cookie,在php.ini的默认配置下,session_start()创建生成随机会话ID并将其存储在用户浏览器的cookie中。但是,我在php.net中找不到任何对此的引用。是否有一个地方可以找到一些适当的文档和内部工作?

其次,我想了解一个简单的登录系统如何在PHP中结合上面的顺序逐步过程,即session,生成的sessionID和session_start()设置的相关cookie。请帮助提供此流程的分步过程,例如: - (假设用户User1已经注册到系统中,现在他正在尝试访问需要登录系统的页面)

  1. User1单击URL hxxp://restrictedPage.php(例如)
  2. 系统检查并查看User1未登录 - 意味着系统检查是否显示此处是否存在有效的sessionID。 (那究竟要检查什么?)
  3. 由于在步骤2中检查(我需要帮助)失败,用户将被重定向到具有登录表单的login.php(例如)。
  4. 在登录表单上,用户输入用户名和密码并提交POST表单。
  5. 服务器端 - authenticateUser.php(例如)用db值验证$ _POST ['userName']和$ _POST ['password']。假设这个检查返回true,即用户提供的用户名和密码是正确的。
  6. 从现在开始会发生什么?会话在哪里开始,什么时候创建了sessionID的cookie?什么时候发送到浏览器?
  7. 现在当会话到位时(我需要帮助以了解具体情况)并且用户在登录后进入登录页面,比如,welcome.php也有一个指向restrictedPage.php的链接,现在当用户点击此链接,在服务器上验证会话的确切程度如何?我的意思是持有sessionID的cookie将与此请求一起发送,但是在哪里与服务器上已存在的sessionID进行交叉检查?它是显式完成的(就像我们从db验证用户名和密码那样)还是由PHP自动处理?

2 个答案:

答案 0 :(得分:0)

咦?我不知道这里真正的问题是什么。

创建会话时,会将其保存在文件夹中的服务器上。 (可配置的)

cookie很重要(没有其他方法可以检查哪个会话属于访问者),所以这是保存内容的唯一方法。

大多数情况下,你不必关心这样的事情。 (会话)

当用户按下LOG IN按钮(发布表单)时,会在服务器(PHP)上发生这种情况:

1表单的数据位于$ _POST全局(关联数组,INPUT Name => INPUT Value

2您检查该值是否有效,如果有效,请将这些值与数据库的值进行比较

3A。登录成功后,您可以设置有关登录数据的会话。 (例如:$ _SESSION ["登录"] =数组(" id" => $ id,"用户名" => $ un,&#34 ;密码" => $ pw);)不要忘记加密密码(永远不要将普通密码保存到数据库中)

3B。登录失败,向访问者显示错误。

4用户已登录,服务器将会话中的数据与db值进行比较

4A。值有效继续

4b中。值不等于db值,注销用户(删除会话:unset($ _ SESSION [" login"]))

5访问者访问了'restrictededPage.php'如果会话数据是有效的,则EXISTS继续,否则重定向到404或访问者页面

编辑:

Cookie由session_start()设置,因此服务器可以找到分配给访问者的会话(sessionid)。

可以在php的配置中找到cookie的每个配置。

Cookie值包含单个'字符序列' (?)这是访问者会话的ID。 (如果您知道其他访问者的会话ID,则可以将Cookie的价值更改为其他访问者的ID,因此请勿以任何形式公开ID。)

您可以通过' session_get_cookie_params()'来获取Cookie的参数。

  

返回一个包含当前会话cookie信息的数组   数组包含以下项目:

     

"寿命" - cookie的生命周期。 "路径" - 路径   存储信息的地方。 "结构域" - cookie的域名。   "安全" - cookie只能通过安全连接发送。   "仅Http" - 只能通过HTTP访问cookie   协议

引用来自PHP的文档:http://sg2.php.net/manual/en/function.session-get-cookie-params.php

答案 1 :(得分:0)

当您致电session_start()时,会在开头创建会话(及其Cookie,如果还不存在);它通过响应标题Set-Cookie

发送到浏览器并带有响应

有效的会话ID仅显示&#34;此浏览器在&#34;之前已请求我的页面,仅此而已:PHP检查是否存在该名称的会话(请参阅源以了解如何< / em>发生了这种情况,但这对正常使用并不感兴趣),并将其反序列化为$_SESSION

将其与身份验证,授权和身份相结合 - 通常,登录功能会检查用户名和密码,如果正确,则设置会话变量&#34;这是用户1234&#34;:

if ($is_login) {
    // in real use you would check the username & password against a db
    if ($username == "Piskvor" && $password == "123456") {
        $_SESSION['user'] = 789;
    } else {
        // bad username or password
        $_SESSION['user'] = 0;
    }
} else if ($is_logout) {
    // logout this user from session
    $_SESSION['user'] = 0;
}

然后在受限制的部分中,您可以检查会话变量:

if (is_numeric($_SESSION['user']) && $_SESSION['user'] > 0) {
    do_something_super_secret();
} else {
    redirect_to_login();
}

换句话说,PHP仅根据会话cookie为您创建/恢复$_SESSION数组。完全取决于你构建一些东西(例如身份验证)。