PHP: $_SESSION - 在 $_SESSION 变量中存储临时使用的数据的优缺点是什么

2022-08-30 14:18:31

我最近开始更频繁地做的一件事是在任务开始时检索一些数据,并将其存储在_SESSION美元['myDataForTheTask']中

现在这样做似乎非常方便,但我对使用这种方法的性能,安全风险或类似情况一无所知。这是由具有更多专业知识的程序员经常做的事情,还是更像是业余爱好者的事情?

例如:

if (!isset($_SESSION['dataentry']))
{
    $query_taskinfo = "SELECT participationcode, modulearray, wavenum FROM mng_wave WHERE wave_id=" . mysql_real_escape_string($_GET['wave_id']);
    $result_taskinfo = $db->query($query_taskinfo);
    $row_taskinfo = $result_taskinfo->fetch_row();

        $dataentry = array("pcode" => $row_taskinfo[0], "modules" => $row_taskinfo[1], "data_id" => 0, "wavenum" => $row_taskinfo[2], "prequest" => FALSE, "highlight" => array());

        $_SESSION['dataentry'] = $dataentry;
}

答案 1

会话变量确实是在访问者访问网站上的整个时间内使用这些变量的唯一方法之一(也可能是最有效的),用户没有真正的方法来编辑它们(除了在你的代码或PHP解释器中的漏洞利用),所以它们是相当安全的。

这是存储用户可以更改的设置的好方法,因为您可以在会话开始时从数据库中读取一次设置,并且它可用于整个会话,您只需要在更改设置时进行进一步的数据库调用,当然,正如您在代码中所示, 找出设置是否已经存在或是否需要从数据库中提取设置是微不足道的。

我想不出任何其他安全存储临时变量的方法(因为cookie可以很容易地被修改,这在大多数情况下是不可取的),所以$_SESSION将是要走的路。


答案 2

$_SESSION机制是使用 Cookie。

在Firefox的情况下(也许是新的IE,我没有检查自己),这意味着会话在打开的选项卡之间共享。默认情况下,这不是您期望的。这意味着会话不再是“特定于单个窗口/用户的东西”。

例如,如果您打开了两个选项卡来访问您的网站,而不是使用第一个选项卡以root身份记录,您将在另一个选项卡中获得root权限。

这真的很不方便,特别是如果你编写电子邮件客户端或其他东西(如e-shop)的代码。在这种情况下,您将不得不手动管理会话或在URL中引入不断重新生成的密钥或执行其他操作。


推荐