gmarsi Asked: 2020-12-12 13:46:41 +0800 CST 2020-12-12 13:46:41 +0800 CST 2020-12-12 13:46:41 +0800 CST SESSION 和 COOKIE 的替代品? 772 虽然cookie和session之间确实存在相似之处和不同之处,但这两个选项是否有替代方案? 一方面,cookie信息可以由用户修改,因此不建议存储,例如,用户的 ID。另一方面,一旦用户退出浏览器,会话的信息就会被删除(如果我错了,请纠正我)。那么如何才能安全地存储用户的身份,使其在浏览器退出时无法更改或删除呢? php 4 Answers Voted Best Answer Publisere.com 2020-12-12T19:55:38+08:002020-12-12T19:55:38+08:00 会话PHP安全地将用户名、登录状态和其他内容保存在$_SESSION数组中,因为它存储在服务器上。唯一发送到浏览器的是一个cookie唯一的(称为 PHPSESSID,除非由php.ini更改) ,其中包含ID会话 ID,这是一个唯一的随机数。 一旦您的访问者每次请求您session_start()在顶部的页面时都具有活动会话,它将监视呼叫session_start()请求,从服务器读取会话文件(如果会话存在且有效),并恢复存档集. 该阵列永远不需要离开服务器。cookiePHPSESSID$_SESSION 会话一cookie设置为没有到期日期(除非您弄乱了php.inisession.cookie_lifetime中的选项),因此浏览器在关闭时将其清除。服务器上的会话文件有一个过期时间,由session.gc_maxlifetime(以秒为单位)管理。 通往更安全会话的途径: 使用 bcrypt、scrypt、Argon2 或 PBKDF2 来破解您的密码。 使用 PHP 的内置会话管理系统(更多信息英语 西班牙语) 随处使用 HTTPS,具有超文本严格传输安全性 使用Content-Security-Policy标头更新不安全的请求 如果您需要实现cookie“记住我”,请按照博文中的说明进行操作。 生成两个随机令牌:aselector和identifier 将selectory存储identifier在 HTTP cookie 中,将httpOnly = truey设置secure = true为只能通过HTTPS访问 (并且对 JavaScript 隐藏) 保存令牌表的selector和哈希(这里可以使用 SHA256)identifier 根据存储在您的 cookie 中的令牌,在恒定时间内对用户进行身份验证。 您可以在此处查看有关会话和安全性的更多信息。 在安全登录系统中不能做什么 不要在没有更新的情况下将密码存储在数据库中;这绝不是一个好主意! 不要以简单的方式加密或打乱密码 不要使用弱散列函数(MD5、SHA1 等) 不要使用不安全的随机数生成器(你想使用它random_bytes(),如果你使用的是 PHP 5,random_compat)。 您可以cookie使用session_set_cookie_params函数或在您的php.ini. session_set_cookie_params($lifetime = 0, $path = '/', $domain, $secure = true, $httponly = true); 最后,您需要创建一个脚本来让用户退出会话(并鼓励他们使用它而不仅仅是浏览)。这是一个示例脚本: <?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; 同样在成功登录或注销后,更改会话 ID: session_regenerate_id(); 注销: session_regenerate_id(true); 这篇文章从理论上解释了以下Source以及实现它的Gatekeeper 。 字体 现在您可以进一步调查。 Fredy Romero Sam 2020-12-12T14:09:37+08:002020-12-12T14:09:37+08:00 尝试使用浏览器的 LocalStorage。使用 javascript,它很容易实现,并且当我希望数据在会话之间持续存在时,它已经多次挽救了我的生命。这是一个例子。 现在,关于安全性,好吧,如果我提前告诉你,它可以由了解该主题的用户编辑。但是,您可以在使用之前实施措施来验证该信息。最后,您可以使用数据库来管理用户信息,而不是访问它。 gontrollez 2020-12-12T14:50:50+08:002020-12-12T14:50:50+08:00 那么如何才能安全地存储用户的身份,使其在浏览器退出时无法更改或删除呢? 您不能阻止用户删除或修改他们的会话 cookie。用户可以随时修改他们的会话标识符,或删除他们的 cookie,以便在下次访问时不会检测到它是同一用户。使用 LocalStorage 并不能解决这个问题,因为 LocalStorage 中的数据也可以由用户修改。 出于隐私原因,应该如此。如果他们不想,您不能强迫用户将他们的 ID 发送到您的服务器。 一方面,cookie 中的信息可以由用户修改,因此不建议存储,例如,用户的 ID。 因此,cookie 的值中存储的只是会话 ID,而数据(例如与所述会话相关联的用户 ID)则存储在服务器上。这样用户只能更改会话 ID,这应该足够随机以避免这种情况。 最后,一条建议:只要正确使用会话和 cookie 系统,它是绝对安全的。不要重新发明轮子,并确保正确使用这些系统。 Heber 2021-11-30T08:37:49+08:002021-11-30T08:37:49+08:00 我是一个新手,我正试图把自己放在提问者的位置。这就是为什么我一直在考虑你的评论:“......出于隐私原因。如果用户不想......你不能强迫他将他的 ID 发送到你的服务器......”但是你可以知道 IP 地址他登录。是不是真的?“访问者”的 IP 数据不是小数据,要知道我们从哪里制造了安全问题。我不认为提问者试图重新发明轮子。您似乎有兴趣加强安全性。它不会改变任何东西,但会增加更多的安全性。如果发生安全攻击,我会创建一个“IP 黑名单”。但我的提议会超出这里的要求。
会话
PHP
安全地将用户名、登录状态和其他内容保存在$_SESSION
数组中,因为它存储在服务器上。唯一发送到浏览器的是一个cookie
唯一的(称为 PHPSESSID,除非由php.ini更改) ,其中包含ID
会话 ID,这是一个唯一的随机数。一旦您的访问者每次请求您
session_start()
在顶部的页面时都具有活动会话,它将监视呼叫session_start()
请求,从服务器读取会话文件(如果会话存在且有效),并恢复存档集. 该阵列永远不需要离开服务器。cookie
PHPSESSID
$_SESSION
会话一
cookie
设置为没有到期日期(除非您弄乱了php.inisession.cookie_lifetime
中的选项),因此浏览器在关闭时将其清除。服务器上的会话文件有一个过期时间,由session.gc_maxlifetime
(以秒为单位)管理。通往更安全会话的途径:
如果您需要实现
cookie
“记住我”,请按照博文中的说明进行操作。selector
和identifier
selector
y存储identifier
在 HTTP cookie 中,将httpOnly = true
y设置secure = true
为只能通过HTTPS访问 (并且对 JavaScript 隐藏)selector
和哈希(这里可以使用 SHA256)identifier
在安全登录系统中不能做什么
random_bytes()
,如果你使用的是 PHP 5,random_compat)。您可以
cookie
使用session_set_cookie_params
函数或在您的php.ini
.最后,您需要创建一个脚本来让用户退出会话(并鼓励他们使用它而不仅仅是浏览)。这是一个示例脚本:
注销:
字体
现在您可以进一步调查。
尝试使用浏览器的 LocalStorage。使用 javascript,它很容易实现,并且当我希望数据在会话之间持续存在时,它已经多次挽救了我的生命。这是一个例子。 现在,关于安全性,好吧,如果我提前告诉你,它可以由了解该主题的用户编辑。但是,您可以在使用之前实施措施来验证该信息。最后,您可以使用数据库来管理用户信息,而不是访问它。
您不能阻止用户删除或修改他们的会话 cookie。用户可以随时修改他们的会话标识符,或删除他们的 cookie,以便在下次访问时不会检测到它是同一用户。使用 LocalStorage 并不能解决这个问题,因为 LocalStorage 中的数据也可以由用户修改。
出于隐私原因,应该如此。如果他们不想,您不能强迫用户将他们的 ID 发送到您的服务器。
因此,cookie 的值中存储的只是会话 ID,而数据(例如与所述会话相关联的用户 ID)则存储在服务器上。这样用户只能更改会话 ID,这应该足够随机以避免这种情况。
最后,一条建议:只要正确使用会话和 cookie 系统,它是绝对安全的。不要重新发明轮子,并确保正确使用这些系统。
我是一个新手,我正试图把自己放在提问者的位置。这就是为什么我一直在考虑你的评论:“......出于隐私原因。如果用户不想......你不能强迫他将他的 ID 发送到你的服务器......”但是你可以知道 IP 地址他登录。是不是真的?“访问者”的 IP 数据不是小数据,要知道我们从哪里制造了安全问题。我不认为提问者试图重新发明轮子。您似乎有兴趣加强安全性。它不会改变任何东西,但会增加更多的安全性。如果发生安全攻击,我会创建一个“IP 黑名单”。但我的提议会超出这里的要求。