首页 文章

登录系统中的PHP会话和cookie

提问于
浏览
0

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

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

  • User1单击URL hxxp://restrictedPage.php(例如)

  • 系统检查并看到User1未登录 - 这意味着系统检查是否有明显的有效会话ID . (那究竟要检查什么?)

  • 由于在步骤2中检查(我需要帮助)失败,用户被重定向到具有登录表单的login.php(例如) .

  • 在登录表单上,用户输入用户名和密码并提交POST表单 .

  • 服务器端 - authenticateUser.php(例如)用db值验证$ _POST ['userName']和$ _POST ['password'] . 假设这个检查返回true,即用户提供的用户名和密码是正确的 .

  • 从现在开始会发生什么?会话在哪里开始,什么时候创建了sessionID的cookie?什么时候发送到浏览器?

  • 现在当会话到位时(我需要帮助以了解具体情况)并且用户在登录后进入登录页面,比如,welcome.php也有一个指向restrictedPage.php的链接,现在当用户点击时在此链接上,如何在服务器上验证会话?我的意思是持有sessionID的cookie将与此请求一起发送,但是在哪里与服务器上已存在的sessionID进行交叉检查?它是显式完成的(就像我们从db验证用户名和密码那样)还是由PHP自动处理?

2 回答

  • 0

    当您调用 session_start() 时,会在开头创建会话(及其cookie,如果还不存在);它通过响应头Set-Cookie发送到浏览器并带有响应

    有效的会话ID仅显示"This browser has requested a page from me before",仅此而已:PHP检查是否存在该名称的会话(请参阅源以了解这是如何发生的,但这对正常使用并不重要),并将其反序列化为 $_SESSION .

    您可以将此与身份验证,授权和标识相结合 - 通常,登录功能会检查用户名和密码,如果正确,则设置会话变量"this is user 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 数组 . 在此之上构建一些东西(例如身份验证)完全取决于您 .

  • 0

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

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

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

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

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

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

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

    3A . 成功登录后,您可以设置有关登录数据的会话 . (例如:$ _SESSION [“login”] = array(“id”=> $ id,“username”=> $ un,“password”=> $ pw);)不要忘记加密密码(从不将普通密码保存到db)

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

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

    4A . 值继续有效

    4B . 值不等于db值,注销用户(删除会话:unset($ _ SESSION [“login”]))

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

    编辑:

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

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

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

    你可以得到'session_get_cookie_params()'的cookie的参数 .

    返回包含当前会话cookie信息的数组,该数组包含以下项:“lifetime” - cookie的生命周期(以秒为单位) . “path” - 存储信息的路径 . “domain” - cookie的域名 . “安全” - cookie只能通过安全连接发送 . “httponly” - cookie只能通过HTTP协议访问 .

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

相关问题