【问题标题】:How do I pass session variables from one domain to another in PHP如何在 PHP 中将会话变量从一个域传递到另一个域
【发布时间】:2010-04-27 00:47:27
【问题描述】:

我遇到了需要将 $_SESSION 变量从一个域传递到另一个域的 iFrame 页面的情况。在过去的 16 天里,我尝试了各种方法,但无济于事。我认为唯一合乎逻辑的方法是对调用 iFrame 的 url 中的变量进行编码并在 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 页面上将会话变量作为会话变量返回...

【问题讨论】:

  • 为什么你认为你需要准确地发送会话变量?为什么不使用其他方法?这些域是什么?你控制了他们中的哪一个?他们共享同一个服务器吗?

标签: php cross-domain session-variables urlencode decode


【解决方案1】:

序列化sessiondata数组并作为参数发送,然后反序列化 http://www.php.net/manual/en/function.serialize.php

【讨论】:

  • 他问了一些方法来做这件事,看起来有点绝望,我就这个问题发表了意见,然后就这样了。这是否是好的做法取决于他。
【解决方案2】:

使用serialize(),然后使用base64_encode() 传递数据而不破坏数据并(主要)保持其结构。

这不是一个好的做法,因为任何弄清楚它是如何工作的人都可以注入任意数据,但如果这是你想做的,它会起作用。

【讨论】:

  • @Col。弹片我正在回答如何做某事,然后提供警告和为什么不应该做的理由。我不会撒谎说我自己过去没有使用过类似的方法。 :D 每个人都需要犯错误才能学习。
  • 另外值得一提的是,没有不好的方法,只有不好的实现。哦,我在我的日子里编写的heracy代码,但仍然完美地完成了它的意图。
【解决方案3】:

为什么不直接将会话 ID 发送到 otehr 域(并假设他们可以读取相同的会话存储基板)将其用作那里的会话 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();
....

C.

【讨论】:

  • 未对此进行测试 - 您可以在调用 session_start() 之前强制将值放入 $_COOKIE[session_name()]
【解决方案4】:

您可以使用函数http_build_query 将关联数组转换为查询字符串

注意:您发布的第二个数组不是会话数组的正确输出。

在接收页面/域上,只需获取查询字符串并将 expected 参数放置/清理到您的 $_SESSION 数组(或您需要对其执行的任何操作)中。

这比使用像序列化/反序列化这样的东西更安全,因为只使用数组。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-11-21
    • 2010-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-26
    相关资源
    最近更新 更多