我正在尝试实施一个系统来让用户登录一段时间。我可以通过使用cookie并将其存储到数据库中然后识别他来做到这一点。
但是最近我听说即使用户关闭浏览器并打开一个新窗口,会话仍然可以存活。我的意思是,在关闭/再次打开浏览器(或甚至多次)之后,会话仍然可用吗?
(最大)可以在以下脚本中使用$_SESSION["LoginValidation"]
多少时间?
<?php
session_start();
$_SESSION["LoginValidation"] = ture;
目前该会话将在关闭浏览器之前可用。
答案 0 :(得分:1)
方法1)session.cookie-lifetime
:这是cookie的生命周期,默认为0,这意味着当浏览器关闭时cookie将被销毁。您可以通过增加此变量来设置更长的生命周期。
它与服务器时间有关,因此您需要考虑客户时间的差异。机器和你的服务器。
还有session.gc-maxlifetime
,这是会话数据被视为存储中的垃圾并被销毁的时间。
虽然您可以将这些设置设置为相对较高的值并使其正常工作,但我建议不要这样做,因为这会在会话存储中留下大量不必要的会话数据,由于GC没有收集实际的死会话
或者 另一种方法是,即使在数据库中关闭浏览器保存会话并获取其ID之后,会话也会生效,并通过
在用户cookie中设置该IDsetcookie("name","value",time()+$int);
因此您可以从$_COOKIE["name"];
获取该值,使用它从数据库中获取会话变量
答案 1 :(得分:1)
为了在关闭浏览器后使会话保持不变,您需要为会话cookie设置到期时间。浏览器关闭时,删除没有到期时间的cookie ,通常称为会话cookie(与PHP会话不同 - 只是相关)。
(旁注:如果您的浏览器配置为&#34;保存打开的标签&#34;退出时,浏览器可能会保存会话cookie,即使它们应该被删除)
因此可以将session.cookie_lifetime设置为较大的值。但这并不能阻止存储在您服务器上的会话数据被删除 - 为了保持数据的持续时间更长,您需要提高session.gc_maxlifetime的值。
但这是解决问题的错误方法
实现此类持久会话会产生安全性和容量影响 - 您绝不应将此作为默认行为实现 - 仅限于用户明确同意的情况。
使用&#34;记住我&#34; cookie作为一种轻量级会话系统是最佳实践解决方案。给它一个随机值(建议你使用一个相当可靠的随机数源,例如base64_encode(openssl_random_pseudo_bytes(64))
和一个不与其他cookie冲突的名称,并将它与你真正希望在实际会话中保持的数据一起存储(例如,经过身份验证的用户名)。