在PHP中使用会话的最新,最佳实践和最简单的方法是什么?
自从我上次使用会话以来,PHP会话似乎已经发生了变化,因此我正在寻找一种使用会话的简单方法,但同时又要使其相对安全并且是一种良好的常规做法。
解决方案
首先,除非我们有非常特定的良好商业理由,否则请仅基于Cookie使用。我有一个客户坚持只为项目进行基于URL的会话。非常没有安全感和工作上的痛苦。
一个好主意是根据每个请求重新生成会话。这使得劫持的可能性大大降低。例如。
session_start(); $old_sessionid = session_id(); session_regenerate_id(); $new_sessionid = session_id();
另一个好的做法是,如果我们要作为系统的一部分进行某种用户登录,则在注销时完全使会话数据无效并清空会话数据,以确保用户真正从系统中注销。我已经看到了通过删除会话cookie即可完成注销的系统。
就简单性而言,它没有什么比以下更好的了:
# Start the session manager session_start(); # Set a var $_SESSION['foo'] = 'whatever'; # Access the var print $_SESSION['foo'];
我们可以按照以下说明将PHP会话存储在数据库中
书。我已经使用了这种方法,并且发现它安全且易于实施,因此我建议使用。
会话管理改变了一段时间(我认为大约是4.4)。旧机制仍然有效,但已弃用。这相当令人困惑,所以我建议不要使用它。今天,我们可以通过访问全局变量$ _SESSION(它是一个数组)来使用会话。我们可以在其中放置对象实例,但是在下一页开始会话之前,需要加载这些对象的类定义。使用自动加载功能可以为我们提供帮助。
必须先启动会话,然后才能使用$ _SESSION。由于启动会话会发送标头,因此之前没有任何输出。这可以通过以下两种方式之一解决:
我们或者总是在脚本的开头开始会话。或者,我们缓冲所有输出,然后在脚本末尾将其发送出去。
One good idea is to regenerate the session on each request. this makes hiHyman much less likely.
这(略)是个坏建议,因为它可能会使该站点无法访问。但是,每当用户权限更改时,我们都应该重新生成会话ID。通常,这意味着只要他们登录即可。这是为了防止会话固定(会话劫持的一种形式)。有关此主题的更多信息,请参见此最新线程@ Sitepoint。
仅使用基于cookie的会话是可以的,但是如果在登录时重新生成会话ID,它不会增加任何其他安全性,并且会降低可访问性。
尽管数据库对于会话而言可能更安全,但我们首先应将精力集中在会话中存储的内容上,它实际上不应包含任何东西,而应包含用于标识用户的ID(并且可以是页面之间的名字或者临时变量) 。
我建议只使用默认的cookie。数据库会话在每个页面上都具有额外的优势,尽管并非每个站点都是斜线,但预先优化像这样的简单操作也没有害处。
对于用法,我建议使用标准全局变量:
$_SESSION['yourvar'] = 'somevalue';
如果在所有代码中都使用该方法,则稍后可以通过使用session_set_save_handler轻松更改后端,这提供了实现会话后端的统一方法。请注意,我们可以使用一个对象来包含所有会话处理,只需将数组分配给每个条目数组(" Staticclass"," staticmethod")。
为了更深入的使用,我建议我们看一下KohanaPHP中的会话处理方式。
将$ SESSION数组封装在Session()对象中,该对象允许我们以类似的方式(但仍可分离)从会话,获取和发布变量,包括自动安全过滤器,闪存变量(使用过一次然后销毁的var)和默认值设置器。
看一下Symfony在这一点上的行为,它非常有帮助。