在SESSION应该保存什么东西,什么不应该?

时间:2011-01-11 10:51:22

标签: php session

我举一个例子,为什么这个问题出现在我脑海中: 让我们说我创建了扩展PDO类的类'PDOstart'。在类'PDOstart'上,PDO所需的所有变量都在私有部分(如主机,用户,密码和ect)上定义。所以它很容易使用PDO类:

$con = new PDOstart();
$con->query("SELECT ... ");

因为在我的网页上我只使用一个数据库,所以我开始考虑为什么不将PDOstart对象添加到SESSION中?像:$_SESSION['db'] = $con;?所以我不需要在每个页面都做“新的PODstart”。但我不确定那会是个好主意......

有什么我应该避免添加到$ _SESSION(出于安全或性能原因)?

3 个答案:

答案 0 :(得分:7)

用户ID,以便每次加载页面时都知道浏览的用途,元数据,例如页面更改的时间跨度(Bot Detect),本地信息,用户模板选择。那个会议真正需要的任何东西。

正如你所说$con让我解释一下。

php中有几种变量类型,主要是:

  • 字符串
  • 布尔的
  • 整数的
  • 物体
  • 阵列
  • 资源

现在你可以将所有这些存储到除资源之外的会话中,因为存在文件句柄,与外部实体的连接,只有在PHP处理页面时打开,然后关闭。< / p>

其他都没问题,因为存储在内存中并且是静态的,除非您以编程方式更改它们,否则它们不会更改。

您应该在会话中存储的主要内容是

  • GUID :以便您可以跟踪用户的登录信息。
  • Flash数据:因此,如果您进行重定向,则可以在另一页上显示错误消息。
  • 浏览器数据,以便您可以比较当前浏览的浏览器与上一个浏览器相同,这样就可以终止安全会话。

诸如用户行之类的数据库数据之类的东西不应存储在会话中,您应该创建一个单独的缓存机制来为您执行此操作。

答案 1 :(得分:1)

可以在会话中存储你的PDOstart类,只要你记住这一点:

  • 当你执行$ _SESSION ['key'] = $ obj时,你实际上是序列化对象(假设默认的php会话处理程序,这是在刷新数据时发生的)。
  • 当您对“资源”(例如数据库连接)执行此操作时,很可能连接不会持续存在。
  • 要解决此类情况,php具有__sleep和__wakeup魔术方法

我认为你的PDOstart类将确保在__construct和__wakeup上连接到PDO,使复杂性加倍。

然而,还有另外一个原因:不会这样做:会话可能随时消失,所以你不应该真正依赖任何信息。当然,您可以放置​​保护措施,这将重新初始化所有内容,但这又会增加不必要的复杂性。

没有黄金法则(至少我知道)明确规定你应该在会话中保留尽可能少的信息,但这似乎是一种相当常见的方法。我会保留一个用户ID,可能还有一个访问令牌。没有太多阻止你这样做,否则你。

至于安全性,只要会话整体安全,这种使用就不重要了。他们从来都不是真的,但这是一个完全不同的主题。

简短的回答:存储的好东西 - 用户ID,存储的坏东西 - 其他一切。

答案 2 :(得分:0)

如果你开始在会话中存储对象,你应该真正添加一个自动加载器。如果你的对象的类不可用,你将获得一个标准的破坏对象如果你没有自动加载mecanism进行类加载。

然后,根据会话的存储方式,您应该注意它们所采用的大小。假设您将它存储在一个非常快的驱动器或memcached服务上,您不必太担心这个文件将在您的用户的每个请求中被读取。如果您的驱动器上的IO速度很慢,请小心。现在,如果您将会话存储在数据库中,您可能会关心会话表中的插入/更新/删除节奏,一些数据库(想想MySQL)在处理一个表上的高写入负载时并不是很神。

安全性而言,您不必过多担心会话存储,因为它在服务器上。至少如果您(管理员)使用磁盘存储,您应确保所有处理的应用程序不使用相同的目录进行会话存储,否则较弱的应用程序将定义会话的安全级别。