这个登录会话安全吗?

6
我使用PHP会话创建了一个登录系统。以下是其工作原理:
1)用户使用有效的登录信息登录时: 他们的信息(用户名和密码)以及一些其他信息将与会话一起存储: 过期时间:仅为当前时间添加5分钟(因此如果用户在22:30登录,则过期时间将为22:35)。
2)用户已登录的每个页面视图都会检查会话是否存在。如果不存在,则将用户重定向到登录页面。 如果会话存在,则检查过期时间并将其与当前时间进行比较。如果过期时间大于当前时间(用户已经闲置了5分钟或更多时间),则会检查其用户详细信息(与数据库中的详细信息进行比较),更新“Expiretime”会话,但如果过期时间小于当前时间,则不会检查任何详细信息,会话会更新“Expiretime”,并允许用户继续浏览。我这样做是为了防止对数据库进行持续查询以节省带宽。
所以基本上,一旦用户成功登录,直到他们变得不活跃(停留在一个页面)超过5分钟或注销,他们的用户名和密码就不会再次在数据库中进行检查。
忘记向大家提到一些内容了: 过期时间会话实际上称为expire_time_unique_characters($_SESSION['expire_time_ '.$unique_nu]),这意味着邪恶的人也必须找到$unique_nu来伪造会话……
我只是感觉这不是很安全。
此外,这个项目是开源的(人们可以查看源代码),因此在这里存在更高的风险......
你们能给我一些反馈吗?
谢谢

那么您就不需要每隔几分钟重新检查登录组合。只需不要将用户名/密码存储在服务器上。此外,也不要将它们存储在数据库中!为此使用强哈希算法(最好带有密钥拉伸)。 - Niklas B.
@Niklas 我认为这个问题的提出者的意思是,如果被删除的用户是已经登录到数据库中的,那么他将因为不在数据库中而被注销。 - Matej
但是有多大的概率有人能够猜测出会话ID呢? - user849137
@Nav:这取决于会话ID的熵值。PHP在这里提供了合理的默认值,因此您可以简单地使用session_start。而且,绝对不要在数据库中存储明文密码。 - Niklas B.
如果您的数据库在本地主机上,它不应该消耗太多带宽,因此每次重新加载页面时检查用户会话与数据库相比应该是完全没有问题的。 - Matej
显示剩余9条评论
2个回答

2

在会话中存储用户的ID已经足够了。

但是,您应该实现某种保护措施来防止会话固定/劫持。


0

$_SESSION 相对安全,只要使用得当。例如,如果将会话文件保留在Web根目录下,则只有直接访问服务器文件系统的人才能访问它们。因此,您仍然希望保持密码加密,但纯文本中的用户名是完全可以的。

将会话ID保存在cookie中而不是使用查询字符串方法,否则任何复制URL的人都会意外共享其会话并绕过登录。

应该就这样了。显然,如果有人正在黑客用户的网络并获取cookie数据,那么他们可以使用它来假装成用户,但您几乎无能为力。您可以使其更难(例如,要求用户代理字符串相同),但最终如果用户的网络遭到破坏,则您几乎无法做任何事情。无论如何,保护他们在您的服务器上的数据而不是他们的网络不是您的责任。


值得注意的是,HTTPS可以解决Cookie问题(尽管这超出了问题的范围,而且HTTPS仍然存在问题)。 - Corbin
我忘了在问题中提到另一件事。你能帮我检查一下我的编辑吗? - user849137
没有区别。访问$_SESSION由浏览器提供的PHPSESSID(默认名称)cookie进行管理。 - Niet the Dark Absol
那么您能解释一下有人如何进入这个领域吗?谢谢。 - user849137
如果有人获得了通过SSH登录到您的服务器所需的用户名和密码(或者如果您的FTP根包含会话位置),那么他们可以直接访问那里的文件并阅读它们。 - Niet the Dark Absol

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接