1

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

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

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

4

6 回答 6

5

不要使用单引号:

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

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

注意:由于几个原因,这可能是不安全的 - 主要是通过键碰撞注入。考虑一下我是否发布了登录的用户 ID。

这可以通过封装来缓解:

$_SESSION['posted_data'] = $_POST;
于 2013-08-22T14:52:23.553 回答
1

如果你真的想按照你的说法去做,你可以使用类似的东西

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

这会起作用,但会是“坏事” - 有足够的范围覆盖$_SESSION变量中已经存在的项目:

索引.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;

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

于 2013-08-22T15:02:21.567 回答
1

你不想让他们分开吗?

$_SESSION['response'] = $_POST;
于 2013-08-22T14:54:52.007 回答
0

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

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

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

只是关于安全性的快速说明,如果您像很多人一样使用会话来存储用户 ID,如果我向您的脚本发送 POST 请求会发生什么userid=1

我要说的是,小心你在做什么。如果可能的话,你最好按照建议做,并在 $_SESSION 中为 post vars 使用唯一键,例如$_SESSION['post_vars'] = $_POST(或者['form_data']如果你使用它来持久化表单数据,这通常是人们这样做的原因)。

于 2013-08-22T15:01:38.077 回答
0

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

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

如果您希望这些数据可用,您需要以某种方式将其持久化,前提是支付网关为您提供可利用的客户信息。可能的解决方案是数据库,键/值存储......

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

于 2013-08-22T15:26:36.337 回答
0

您还可以使用数组联合运算符

$_SESSION = $_POST + $_SESSION;

这将获取 的值$_POST并添加$_SESSION其键尚未存在于 中的值$_POST

于 2013-08-22T15:04:19.363 回答