我遇到过一种情况,我需要将$ _SESSION变量从一个域传递到另一个域的iFrame页面。我花了最后16天尝试各种方法无济于事。我认为唯一合乎逻辑的方法是在url中编码调用iFrame的变量并在iFrame页面中解码它们。我不知道如何解决这个问题,我正在寻找可以找到的任何样品,帮助等。
感谢您提出的所有建议。
这是我想要做的一个例子......
示例:
<!-- Note only using hidden as I didn't want to build the form at test phase-->
<form name="test" method="post" action="iframe_test.php">
<input type="submit" name="Submit" />
<input type="hidden" name="fName" value="abc" />
<input type="hidden" name="lName" value="def" />
<input type="hidden" name="address1" value="ghi" />
<input type="hidden" name="address2" value="jkl" />
<input type="hidden" name="country" value="mno" />
<input type="hidden" name="postal_code" value="pqr" />
<input type="hidden" name="city" value="stu" />
<input type="hidden" name="retUrl" value="vwx">
<input type="hidden" name="decUrl" value="yz">
所以从这里开始我正在点击iframe_test.php并执行以下操作: PHP代码: 功能StripSpecChar($ val){ return(preg_replace('/ [^ a-zA-Z0-9“” - 。@:/ _] /','',$ val)); }
foreach ($_POST as $key => $val) {
$_SESSION[$key] = StripSpecChar($val);
}
我得到一个如下所示的会话数组: 代码:
Array
(
[fName] => abc
[lName] => def
[address1] => ghi
[address2] => jkl
[country] => mno
[postal_code] => pqr
[city] => stu
[retUrl] => vwx
[decUrl] => yz
)
到目前为止仍然很好......打电话给iFrame
代码:
<body>
Some page stuff here
<div align="center"><span class="style1"><strong>This is the iFrame Page</strong></span>
</div>
<div align="center">
<iframe src="https://www.other_domain.org/iframe/reserve.php" width="500" height="350" frameBorder="0"></iframe>
</div>
</body>
所以我该怎么做......
$_SESSION['fName']['abc'];
$_SESSION['lName']['def'];
$_SESSION['address1']['ghi'];
$_SESSION['address2']['jkl'];
$_SESSION['country']['mno'];
$_SESSION['postal_code']['pqr'];
$_SESSION['city']['stu'];
$_SESSION['retUrl']['vwx'];
$_SESSION['decUrl']['yz'];
并将其转换为我正在寻找的编码网址?进一步完成后,如何将会话变量恢复为新域iFrame页面上的会话变量...
答案 0 :(得分:2)
序列化sessiondata数组并将其作为参数发送,然后对其进行反序列化 http://www.php.net/manual/en/function.serialize.php
答案 1 :(得分:1)
使用serialize()然后base64_encode()传递数据而不会破坏数据,并且(主要)维护其结构。
这不是一个好的做法,因为那时任何弄清楚它是如何工作的人都可以注入任意数据,但如果这就是你想做的事情,那就可以了。
答案 2 :(得分:1)
为什么不将会话ID发送到另一个域(并假设他们可以读取相同的会话存储基板)将其用作那里的会话ID,例如。
<?php
// catch remote session id, validate and reassociate
if (md5($_GET['exported_sessid'], $shared_secret) == $_GET['check_hash']) {
// (basic CSRF check
session_id($_GET['exported_sessid']);
}
session_start();
....
下进行。
答案 3 :(得分:0)
您可以使用一个辅助数组并将其转换为具有函数http_build_query
的查询字符串注意:您发布的第二个数组不是会话数组的正确输出。
在接收页面/域上,只需获取查询字符串并将预期的参数放置/清理到$ _SESSION数组中(或者您需要处理的任何内容)。
这比使用序列化/反序列化更安全,因为只使用了数组。