我在一个网站上工作,想创建用户登录和会话。检查会话是否存在(如cookie或会话变量检查)的最安全方法是什么,或者在php中使用会话有什么更好的主意?
2 回答
session_id()
返回当前会话的会话 ID,如果没有当前会话(不存在当前会话 ID),则返回空字符串 ("")。
但这只是告诉您会话是否处于活动状态。
大多数时候,我只是session_start();
在每个脚本的开头调用(即使用户没有登录)。登录时,我$_SESSION['user']
使用用户 ID 或用户对象进行设置。注销时,我只是unset($_SESSION['user']);
。通过检查empty($_SESSION['user'])
我可以检查是否有人仍然登录。如果您在会话中的其他位置存储与用户相关的信息,请不要这样做,否则下一个登录的人可能会得到他不应该看到的信息(在这种情况下使用session_destroy();
)。
但安全吗?只需通过 GET/POST url 重写(仅限 cookie)停用 session-id 传播,因此它们最终不会出现在可以缓存或分发给其他人的 URL 中(在这种情况下,会话劫持是可能的)。您可以通过session.use_only_cookies
在 php.ini 中进行设置来做到这一点。
如果您在不受信任和/或配置错误的共享服务器上托管,则可能存在其他安全问题 - 它可能导致同一台机器上的其他人读取您的会话数据。在这种情况下,您可以通过重写会话处理程序将会话数据存储在数据库中。只需在 intertubes 上搜索session handler mysql
,我确信有足够的现成解决方案。并且不要在会话中存储密码等敏感信息,每次需要比较时最好进行查询。
除此之外...使用 ssl/https 进行登录和用户管理,因此不会传输明文密码。仅在数据库中存储带盐的 pw 哈希。不要让任何人看到密码(意思是:永远不要将它们打印到 html 或电子邮件中)。不要对用户可以看到的 id 使用 auto_increment 值(因此,猜测)。好的,这已经超出了问题的范围。
这里有一些关于会话安全的教程