循环使用$POST使$SESSION等效


loop through $POST to make $SESSION equivalent

这是否是对API发送的$POST数据进行循环并从中创建等效的$SSESSION名称/值对的正确方法?

foreach($_POST as $key=>$value)
{ $_SESSION['$key']=$value; }

更新:首先,感谢您的回复-我想我需要解释我试图克服的问题,以及为什么要考虑此功能。$_POST响应来自支付处理器网关-问题是,由于支付表单/处理不在我们的域中,因此通过$POST将支付结果(批准/拒绝等)中继到我们的服务器-当我们的PHP代码试图处理响应数据时,它会在该域下而不是我们的域下查找各种PHP结构(如PHP包含"file.PHP")errors out-我需要将$POST数据移到会话中,然后将人员移回我们的域,以便文件/目录/资源树是正确的。这对我遇到的事情有意义吗?

不要使用单引号:

foreach ($_POST as $key => $value) {
  $_SESSION[$key] = $value;
}

我鼓励您阅读PHP中的字符串。

注意:这可能是不安全的,原因有很多——主要是密钥碰撞注入。考虑我是否发布了登录的用户id。

这可以通过封装来缓解:

$_SESSION['posted_data'] = $_POST;

你不想把它们分开吗?

$_SESSION['response'] = $_POST;

如果您真的想按您所说的去做,您可以使用类似的东西

$_SESSION=array_merge($_SESSION,$_POST);

这是可行的,但却是一件"坏事"——有足够的范围来覆盖$_SESSION变量中已经存在的项目:

index.php:

<form action="2.php" method="post">
<input type="text" name="hidden" value="hidden">
<button type="submit">Click</button>
</form>

2.php:

<?php
session_start();
session_unset();
$_SESSION['hidden']="existing";
$_SESSION=array_merge($_SESSION,$_POST);
echo '<pre>'.print_r($_SESSION,true).'</pre>';

最好使用

$_SESSION['POST']=$_POST;

显然,在执行此操作之前,请执行任何需要的数据检查,尽管

忽略这可能导致的安全问题,具体取决于您如何使用它,您可以使用:

$_SESSION = array_merge($_POST, $_SESSION);

这只会引入POST变量,这些变量的密钥尚未在$_SESSION中找到。当然,如果您希望POST变量优先,请切换它们。

简单介绍一下安全性,如果像很多人一样,你使用会话来存储用户id,如果我用userid=1向你的脚本发送POST请求,会发生什么?

我想说的是,小心你用这个做什么。如果可能的话,最好按照建议进行操作,并在$_SESSION中为后变量(如$_SESSION['post_vars'] = $_POST)使用唯一密钥(如果您使用它来持久化表单数据,则可能使用['form_data'],这通常是人们这样做的原因)。

您也可以使用数组并集运算符:

$_SESSION = $_POST + $_SESSION;

这取$_POST的值,并将其密钥尚未存在于$_POST中的$_SESSION的值相加。

由于POST是由支付网关进行的,因此会话将与其关联(并且很可能在第一次请求时丢失,因为可以假设它永远不会麻烦读取会话cookie)。

您的客户端在会话中永远不会看到这些数据。

如果你想让这些数据可用,你需要以某种方式将其持久化,如果支付网关为你提供了可利用的客户端信息。可能的解决方案是数据库、密钥/值存储。。。

或者,支付网关通常会允许您指定一个链接,以便在购买后将客户端的浏览器重定向到该链接。从POST中获取参数,您可以将它们附加到重定向URL,以将它们作为GET参数传回您的网站。