2009-04-15 55 views
2

我正在一个网站上工作,并且想要创建用户登录和会话。什么是最安全的方法来检查会话是否存在(如cookie或会话变量检查),或任何更好的想法,然后在PHP中使用会话?在php中创建会话最安全的方法

回答

8

session_id()回报ŧ他当前会话的会话ID或空字符串(“”),如果没有当前会话(不存在当前会话ID)。

http://de.php.net/manual/en/function.session-id.php

但只是告诉你,如果有一个会话是活动的。

大部分时间,我只是在每个脚本的开头(即使用户没有登录)调用session_start();。在登录时,我使用用户标识或用户对象设置了$_SESSION['user']。在注销时,我只是unset($_SESSION['user']);。通过检查empty($_SESSION['user'])我可以检查某人是否仍然登录。如果你在会话的其他地方存储了依赖于用户的信息,请不要这样做,否则登录的下一个人可能会得到他不应该看到的信息(在这种情况下,请使用session_destroy();)。

但安全吗?只需通过GET/POST url去重写session-id传播重写(仅限cookie),这样它们就不会以可以缓存或分发给其他人的URL(在这种情况下,会话劫持成为可能)结束。你可以通过在php.ini中设置session.use_only_cookies来实现。

如果您在不可信和/或配置错误的共享服务器上托管,则可能会有其他安全问题 - 这可能会导致同一台计算机上的其他人读取您的会话数据。在这种情况下,您可以通过重写会话处理程序将会话数据存储在数据库中。只需在intertubes上搜索session handler mysql,我确信有足够的随时可用的解决方案。并且不会在会话中存储密码等敏感信息,所以每次需要对其进行比较时最好进行一次查询。

除此之外...使用ssl/https进行登录和用户管理,因此不会传输明文密码。在数据库中只存储salt的pw-hashes。不要让任何人看到密码(意思是:不要将它们打印到HTML或电子邮件)。请勿将auto_increment值用于用户可以看到的ids(并因此猜测)。好吧,这已经超出了问题范围。

+0

',并且不会在会话中存储密码等敏感信息,所以每次需要对其进行比较时,最好进行一次查询。 - 嗯,我认为存储密码的单向加密版本(md5 + hash)会更快,然后检查它是否会将查询重复执行到db一次又一次 – Strae 2009-04-15 16:59:13

+0

为真,但通常您不需要检查每个网页浏览的密码,只有#1:登录和#2:更改它(如果你要求用户提供当前的密码来设置一个新的密码)。对于#1,你必须查询数据库,而#2不会经常发生,所以额外的开销可以忽略不计。 – stefs 2009-04-15 17:21:24