通过会话传递数据

时间:2011-10-11 14:40:20

标签: php session

当我通过$_POST传递时,我不允许用户编辑一些唯一的ID,因此我使用的是$_SESSION,因为据我所知,会话不能编辑。

这是一个好的&安全解决方案 在阅读之后,我正在解开它。

我想确定,这就是我要问的原因。

我正在做的一些代码:

if(!isset($_POST['save'])) {
     $posts = $_POST['special_ids'];
     [..]
     $_SESSION['posts'] = $posts;
     echo "<input type="hidden" name="save" value="1"/><input type="submit" value="Submit!"/>";
     [..]
} elseif(isset($_REQUEST['save'])) {
     //then I'm reading the $posts
     $posts = array($_SESSION['posts']);
     [...] //doing what I need with it.
     unset($_SESSION['posts']);
}

3 个答案:

答案 0 :(得分:0)

如果您在服务器上定义值并且不希望允许最终用户编辑它们,那么使用$ _SESSION而不是将它们发送到客户端并将它们重新取回它们肯定更安全,因为它们是可能已被篡改。

由于缺少服务器漏洞,客户端无法直接更改其会话值。

答案 1 :(得分:0)

我认为这是一个很好的解决方案。 我现在不管你的框架和你的具体要求,最好只保存对数据库中用户的引用,并将数据保存在数据库中并编写一个函数来获取值。

但对于大多数应用程序来说,这将是一个有效的解决方案。

答案 2 :(得分:0)

您传递的数据是什么?

通常,会话应仅用于无限期“浮动”的数据。它不应该被用作将数据从一个屏幕传递到另一个屏幕的“简单”方式。

如果您的数据通常与用户的登录相关联,那么这将适用于您应用中的许多屏幕,例如他的帐号或邮政编码或其他类似屏幕,那么会话数据就是保存它的合适位置。< / p>

但是如果你有想要从一个屏幕传递到另一个屏幕的数据,会话是一个非常糟糕的地方。如果数据控制程序流,则尤其如此。出于所有原因,全球数据是危险的,然后是一些原因。

首先,在网络应用中,您无法控制用户下一步会做什么。他可以单击“提交”按钮,或者可以点击浏览器后退按钮,或者他可以在应用程序中键入一些完全不同的页面的URL。你说你会在使用它之后清除会话数据,但是你怎么知道你甚至会进入清除它的屏幕?你无法强迫这种情况发生。假设您的意图是:用户打开屏幕A并单击提交。您保存他在会话中输入的内容然后显示屏幕B.当用户单击提交时,在B上输入的数据加上会话数据由屏幕C处理。现在用户显示屏幕A并单击提交,然后当屏幕B显示时他输入屏幕D的URL。半小时后,在访问了许多其他页面后,他输入了屏幕C的URL。会话数据仍然存在。应该怎么办?如果您的程序检查会话数据的存在并根据它是否存在而提供不同的显示,则情况会更糟。就像你说你显示屏幕A,收集会话数据,然后转到B.但是你的程序这样做是因为当显示程序A时,如果会话数据存在必须意味着我们已经在这里去B,否则留在A.我看过很多像这样工作的程序。然后,如果用户按下浏览器或键入URL,则会话数据被遗忘,并且当他下次尝试进入屏幕A时,他在没有输入任何内容的情况下被神奇地和神秘地传送到屏幕B.

其次,它会造成维护噩梦。六个月后你回来维持这个计划。您会看到一个程序从会话变量中获取数据。它是怎么到达那里的?什么程序把它放在那里以及在什么情况下?还有谁在读它?什么时候?将值作为参数传递给子例程时,可以轻松查看传递的内容,时间和方式。但是当你使用像会话变量这样的全局数据时,这一切都很神秘。

全局数据似乎是复杂数据传递方案的简单方法。但这是一个陷阱。

好吧,我不确切知道您需要传递的数据或使用方式,因此上述内容可能与您的案例相关或不相关。

对Matt的回复澄清

会话数据应该用于与SESSION相关联的数据,而不是与单个事务相关联的数据,即对服务器的单次往返。因此,例如,如果您有关于用户的数据,例如帐号或他所在的时区,那么保留会话数据是合理的。但是有关特定事务的数据,例如正在更新的记录或发回的错误消息,不应保存在会话数据中。

如果您必须确保在使用后立即清除会话变量,否则下一个事务将处理不正确,那么这不应该在会话数据中。因为它介于很难和不可能保证数据被清除之间。

“其他路线”不仅可行,而且无法控制。您不知道用户可以在浏览器中键入的URL。原则上,我猜你可以让你的应用程序中的每一个页面检查你在任何地方设置的每个会话变量,以某种方式找出在进入这个屏幕时不应该设置哪些,并清除它们。然后,每当您创建一个新的会话变量时,您必须更新每个屏幕以将其添加到列表中。好的,它可能是一个常见的功能,因此每次添加新的会话变量时,您不必更新一百个屏幕。但是你仍然需要记住更新这个功能并正确检查所有会话变量。为什么会造成维护头痛?只是不要这样做。

即使您可以使其工作,您仍然存在全局数据问题。全球数据不好。