Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/229.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 通过会话传递数据_Php_Session - Fatal编程技术网

Php 通过会话传递数据

Php 通过会话传递数据,php,session,Php,Session,我不想让用户编辑一些唯一的ID,当我通过$\u POST传递它时,所以我使用$\u SESSION,因为据我所知,会话是无法编辑的 这是一个好的、安全的解决方案吗? 当然,我看完后就不安了 我想确定,这就是我问的原因 我正在执行的一些代码: if(!isset($_POST['save'])) { $posts = $_POST['special_ids']; [..] $_SESSION['posts'] = $posts; echo "<inpu

我不想让用户编辑一些唯一的ID,当我通过
$\u POST
传递它时,所以我使用
$\u 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']);
}
if(!isset($\u POST['save'])){
$posts=$_POST['special_id'];
[..]
$\会话['posts']=$posts;
回声“;
[..]
}elseif(isset($\u请求['save'])){
//然后我在看$POST
$posts=数组($_会话['posts']);
[…]//用它做我需要的事。
取消设置($_会话['posts']);
}

如果您在服务器上定义了这些值,并且不想让最终用户编辑它们,那么使用$\u会话肯定比将它们发送到客户端并重新获取它们更安全,因为它们可能已被篡改


如果没有服务器漏洞,客户端不可能直接更改会话值。

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


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

您传递的数据是什么

一般来说,会话应该只用于不确定地“浮动”的数据。它不应被用作从一个屏幕向另一个屏幕传递数据的“简单”方式

如果您有与用户登录相关的一般数据,这将适用于应用程序中的许多屏幕,如他的帐号或邮政编码等,那么会话数据是保存它的适当位置

但是,如果您想将数据从一个屏幕传递到另一个屏幕,会话是保存数据的一个非常糟糕的地方。如果数据控制程序流,尤其如此。由于种种原因,全球数据是危险的,但也有一些原因

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

第二,它制造了一场维护噩梦。六个月后你会回来维持这个计划。您可以看到一个程序从会话变量中提取数据。它是如何到达那里的?什么程序把它放在那里,在什么情况下?还有谁在读它?什么时候当您将值作为参数传递给子例程时,您可以很容易地看到传递的内容、时间和方式。但当您使用会话变量等全局数据时,这一切都是一个谜

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

嗯,我不知道你需要传递什么样的数据,或者如何使用这些数据,所以上面的内容可能与你的情况有关,也可能与你的情况无关

回复Matt的澄清

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

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

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