[英]PHP sessions and cookies in a login system
我在很多地方读过,例如session_start()
创建一个 cookie ,session_start()
创建一个 cookie ,在 php.ini session_start()
的默认配置下创建一个随机sessionID
并将其存储在用户浏览器上的一个 cookie 中。 但是,我在php.net中找不到对此的任何引用。 有没有地方可以找到一些适当的文档和内部工作?
其次,我想了解一个简单的登录系统如何在 PHP 中结合上述内容的顺序逐步过程,即会话、生成的sessionID
和session_start()
设置的相关 cookie。 请帮助提供此流程的分步过程,例如:-(假设用户 User1 已经注册到系统中,现在他正在尝试访问需要他登录到系统的页面)
$_POST['userName']
和$_POST['password']
。 让我们假设这个检查返回真,即用户提供的用户名和密码是正确的。sessionID
的 cookie 是什么时候创建的? 什么时候发送到浏览器?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 会发生以下情况:
表单的数据在$_POST
全局中作为关联数组与["form's input name" => "form's input Value", ...]
您检查该值是否有效,如果有效,将这些值与数据库的值进行比较
登录:
登录成功,你设置了一个关于登录数据的会话。 (例如: $_SESSION["login"] = array("id" => $id, "username" => $un, "password" => $pw);
)不要忘记加密密码(永远不要将普通密码保存到数据库中)
登录失败,向访问者显示错误。
用户已登录,服务器将会话中的数据与 db 值进行比较
值有效; 继续
值不等于 db 值,注销用户(删除会话: unset($_SESSION["login"])
)
如果会话数据是 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.