繁体   English   中英

登录系统中的 PHP 会话和 cookie

[英]PHP sessions and cookies in a login system

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

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

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

当您调用session_start() 它通过响应头Set-Cookie与响应一起发送到浏览器

有效的会话 ID 仅显示“此浏览器之前已向我请求过一个页面”,仅此而已:PHP 检查是否存在具有该名称的会话(请参阅源代码以了解这是如何发生的,但这对于正常使用来说并不有趣) ,并将其反序列化为$_SESSION

可以将其与身份验证、授权和识别结合起来 - 通常,登录功能会检查用户名和密码,如果正确,则设置会话变量“这是用户 1234”:

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数组。 在此之上构建一些东西(例如身份验证)完全取决于您。

嗯? 我看不出这里真正的问题是什么。

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

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

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

当用户在表单中按下登录按钮时,服务器上的 PHP 会发生以下情况:

  1. 表单的数据在$_POST全局中作为关联数组与["form's input name" => "form's input Value", ...]

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

  3. 登录:

    1. 登录成功,你设置了一个关于登录数据的会话。 (例如: $_SESSION["login"] = array("id" => $id, "username" => $un, "password" => $pw); )不要忘记加密密码(永远不要将普通密码保存到数据库中)

    2. 登录失败,向访问者显示错误。

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

    1. 值有效; 继续

    2. 值不等于 db 值,注销用户(删除会话: unset($_SESSION["login"])

  5. 如果会话数据是 1) 有效且 2) 存在,则访问者访问restricedPage.php ,然后继续,否则重定向到 404 或访问者页面。

编辑:

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

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

cookie 值包含一个“字符序列”(?),它是访问者会话的 ID。 (如果您知道其他访问者的会话 ID,您可以将 cookie 的值更改为其他访问者的值,因此切勿以任何形式公开 ID。)

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

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

"lifetime" - cookie 的生命周期,以秒为单位。 “路径” - 存储信息的路径。 “域” - cookie 的域。 "secure" - cookie 只能通过安全连接发送。 "httponly" - cookie 只能通过 HTTP 协议访问。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM