我最近经常开始做的一件事是在任务开始时检索一些数据 并将其存储在$ _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 票数:19 已采纳

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

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

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

===============>>#2 票数:5

$ _SESSION机制正在使用cookie。

对于Firefox(也许是新IE,我没有检查自己),这意味着会话在打开的标签之间共享 这不是你默认的预期。 这意味着会话不再是“特定于单个窗口/用户的东西”。

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

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

===============>>#3 票数:4

我一直使用会话变量来存储用户的信息。 我没有看到任何性能问题。 会话数据基于cookie(如果您关闭cookie,则为PHPSESSID )提取。 我认为它不会比任何其他基于cookie的身份验证更具安全风险,并且可能比将实际数据存储在用户cookie中更安全。

只是为了让您知道,您的SQL语句确实存在安全问题:

SELECT participationcode, modulearray, wavenum FROM mng_wave WHERE wave_id=".$_GET['wave_id'];

永远不应该,我再说一遍, 拿不到用户提供的数据,并用它来运行一个SQL语句而不先清理它。 我将它包装在引号中并添加函数mysql_real_escape_string() 这将保护您免受大多数攻击。 所以你的行看起来像:

$query_taskinfo = "SELECT participationcode, modulearray, wavenum FROM mng_wave WHERE wave_id='".mysql_real_escape_string($_GET['wave_id'])."'";

===============>>#4 票数:3

在决定存储临时数据的位置时,您需要考虑几个因素。 会话存储非常适合特定于单个用户的数据。 如果您发现默认的基于文件的会话存储处理程序效率低下,则可以使用数据库或memcache类型的后端实现其他操作。 有关详细信息,请参阅session_set_save_handler

我发现在用户的会话中存储公共数据是一种不好的做法。 存储数据的更好位置将由多个用户经常访问,并且通过将这些数据存储在会话中,您将为需要此数据的每个用户复制数据。 在您的示例中,您可以为此wave数据(基于wave_id)设置不同类型的存储引擎,该数据不是专门针对用户的会话。 这样你就可以将数据拉下来,然后将它们存储在几个用户可以访问数据的地方而不需要另外的拉动。

===============>>#5 票数:3

如果您在自己的服务器上运行,或者在没有人可以窥探服务器上的文件/内存的环境中运行,则会话数据是安全的。 它们存储在服务器上,只是一个发送给客户端的标识cookie。 问题是,如果其他人可以抢夺cookie并冒充其他人,当然。 使用HTTPS并确保不将会话ID放在URL中应该可以确保用户免受大多数问题的影响。 (如果你不小心的话,XSS可能仍然用于抢夺cookie,请参阅Jeef Atwoods的帖子 。)

至于存储在会话变量中的内容,如果你想在另一个页面上再次引用它,就像把它放在那里,比如购物篮,但是如果它只是用于产生这个结果的临时数据那么就把它放在那里页面,就像当前查看的帖子的标签列表一样。 会话用于每用户持久数据。

===============>>#6 票数:2

使用会话的一些其他缺点:

  1. $_SESSION数据将在session.gc_maxlifetime不活动秒后过期。
  2. 您必须记住为将使用会话数据的每个脚本调用session_start()
  3. 通过多个服务器上的负载平衡来扩展网站可能是一个问题,因为每次都需要将用户定向到同一服务器。 用“Sticky Sessions”来解决这个问题。

===============>>#7 票数:2

另一种改进输入验证的方法是转换_GET ['wave_id']变量:

$query_taskinfo = "SELECT participationcode, modulearray, wavenum FROM mng_wave WHERE wave_id=".(int)$_GET['wave_id']." LIMIT 1";

我假设wave_id是一个整数,并且只有一个答案。

===============>>#8 票数:1

您可能想要考虑REST-ful是如何实现的?

即参见“ REST简介 ”中的“无状态沟通” 一节 ......

“REST要求将状态转换为资源状态,或者保留在客户端上。换句话说,服务器不应该为与其通信的任何客户端保留某种通信状态,而不是单个请求。”

(或任何维基百科上的其他链路的REST

所以在你的情况下,'wave_id'是一个明智的GET资源,但你真的想把它存储在SESSION中吗? memcached肯定是你缓存对象资源的解决方案吗?

===============>>#9 票数:1

$ _SESSION项目存储在会话中,默认情况下,该会话保留在磁盘上。 没有必要像你那样制作自己的数组并将其填入“dataentry”数组条目中。 你可以使用$ _SESSION ['pcode'],$ _SESSION ['modules']等等。

就像我说的,会话存储在磁盘上,指向会话的指针存储在cookie中。 因此,用户不能容易地获得会话数据。

===============>>#10 票数:1

IMO,在会话中存储东西是完全可以接受的。 这是使数据持久化的好方法。 在许多情况下,它也比将所有内容存储在cookie中更安全。 以下是一些问题:

  • 有人可能会劫持一个会话,因此如果您要使用它来跟踪用户授权,请小心。 阅读本文以获取更多信息。
  • 它可能是一种非常懒惰的数据保存方式。 不要只是在会话中抛出所有内容,以便以后不必查询它。
  • 如果您要在会话中存储对象,则在下次请求启动会话之前需要包含其类文件,或者您需要配置自动加载器。

===============>>#11 票数:1

Zend Framework有一个用于会话数据管理的有用库,它有助于实现到期和安全性(对于像captchas这样的东西)。 他们对会话也有一个有用的解释。 http://framework.zend.com/manual/en/zend.session.html

===============>>#12 票数:1

我发现会话非常有用,但有几点需要注意:

1)PHP可以将您的会话存储在tmp文件夹或服务器上其他用户可以访问的其他目录中。 您可以通过转到php.ini文件来更改存储会话的目录。

2)如果要设置一个需要非常严格的安全性的高价值系统,您可能需要在将数据发送到会话之前对其进行加密,然后对其进行解密以使用它。 注意:这可能会产生过多的开销,具体取决于您的流量/服务器容量。

3)我发现session_destroy(); 不会立即删除会话,您仍然需要等待PHP垃圾收集器清理会话。 您可以在php.ini文件中更改垃圾收集器的运行频率。 但是仍然看起来不太可靠,更多信息http://www.captain.at/howto-php-sessions.php

===============>>#13 票数:0

我使用这种方法,我没有看到任何问题。 与cookie不同,数据不会存储在客户端,这通常是一个很大的错误。

像任何东西一样,只要注意你总是清理用户输入,特别是如果你将用户输入放入$ _SESSION变量,然后在SQL查询中使用该变量。

===============>>#14 票数:0

这是相当常见的事情,会话通常比连续数据库命中更快。 它们也相当安全,因为PHP开发人员一直在努力防止会话劫持。

唯一的问题是,当某些内容发生变化时,您需要记住重建会话条目。 并且,如果除了拥有会话的用户以外的任何人更改了任何会导致需要刷新此密钥的用户,则没有简单的方法来通知系统刷新该会话密钥。 可能不是什么大不了的事,但你应该注意的事情。

===============>>#15 票数:0

$ _SESSION在安全性方面非常有用,因为它是用户主动在您的页面上存储信息的服务器端方式,因此除非您的实际php文件或服务器具有被利用的弱点,否则难以入侵。 一个非常好的实现是存储变量以确认用户已登录,并且仅允许在确认登录时采取操作。

  ask by community wiki translate from so

未解决问题?本站智能推荐:

3回复

PHP - 什么是会话变量的替代品

我在会话中存储了很多变量,这会产生性能问题。 所以,我被要求将它存储在其他地方,我可以将它存储在数据库中,但这又会很慢。 是否有更好的存储会话变量的替代方案? 全局变量是每个文件/请求。 虽然cookie会向用户打开变量,但不会保留服务器端。 提前感谢您的回答!
1回复

PHP + Wordpress:在wp-login.php模板上获取会话变量

我正在编辑wp-login.php以创建自定义登录屏幕。 也许有更好的方法可以做到这一点,因此,如果有人有经验,欢迎提出任何意见。 在主题的functions.php中,我开始一个会话: 在主题文件中,我设置了一个会话变量: 在wp-login.php中, echo $_
2回复

PHP的session_set_save_handler中的回调方法可以是私有的吗?

我在PHP中编写自定义会话处理程序,并尝试将session_set_save_handler中定义的方法设为私有。 例如,我可以将open函数设置为private而没有任何错误,但是当我将write方法设为私有时,它会咆哮我。 致命错误:在第0行的Unknown中调用来自上下文
1回复

回显会话变量,然后取消设置会话变量,不显示会话变量

我的问题是:当我是echo会话变量时,它运行良好,但是当我在echo后破坏该变量时,它没有得到echo。
2回复

从CodeIgniter中的视图检查会话

从CodeIgniter中的视图检查会话的最佳方法是什么,它在用户指南中没有显示,否则我将不得不对所有内容进行两次观看,这有点奇怪...仍然是CodeIgniter的新手...... 请帮忙! 谢谢...
1回复

cakephp-无法在控制器中检索会话

我在cakephp会话中遇到问题。 我在控制器(用户/家庭)中创建了一个会话,然后尝试在另一个控制器中检索该会话,但是无法获取它。 另外,我在另一个控制器中创建了另一个会话,但无法在用户控制器中检索到它。 我想知道如何停止这种行为。 谢谢 注意:我使用会话组件。
1回复

如何在用户会话期间为产品设置var值?

我正在浏览产品清单并设置variable值,以识别与客户所需属性相交的产品属性。 在客户会话期间(或至少在它们停留在该页面上时)为每个产品设置variable值的合理有效的方法是什么? 目前,似乎没有为分配每个产品ID的variable的值保留超出分配它的初始while语句的范围。 每
3回复

在装有jQuery的PHP模块之间传递变量

我使用jQuery以“延迟”模式加载PHP模块,但是jQuery加载的模块无法访问“主要” PHP模块的变量。 看起来它也无法访问会话变量。 有没有简单,快速和安全的方法来实现这一目标? 这是用于加载“延迟”页面的代码: 上面的代码使用jQuery inview插件,但是问题出
2回复

PHP的打开和关闭标签和范围语法

我应该如何正确使用“ <?php ”和“ ?> ”语法。 我发现您可以将“打开”和“关闭”标签与“大括号”和“关闭大括号”混合使用,以允许两者之间使用其他语言,但是我做得对吗? 欢迎页面在应输入if语句时触发else语句。 除非用户已登录,否则我想使每个页面都无法访问,因此
2回复

有关PHP范围的问题 - 来自Java程序员的观点

我仍然是PHP的新手,所以我试图理解PHP Web应用程序中的范围概念。 在Java世界中,Java Web应用程序 - 使用Java Server Pages(JSP)和向上 - 将允许Java Bean具有以下级别的范围: 页 请求 会议 应用