【问题标题】:Problem setting PHP SESSION variables within cross-domain iframe在跨域 iframe 中设置 PHP SESSION 变量的问题
【发布时间】:2010-10-22 18:03:21
【问题描述】:

Coles Notes 版本:

index.php?map_id=foo 被加载到 www.not-my-domain.com 上的 iframe。索引集SESSION['map_id'] = foo。 Flash 文件尝试通过 Authenticate.php 获取 SESSION['map_id'],但 Authenticate.php 没有为 any SESSION 变量设置值。

-- 仅限首次加载,跨域问题。

详细:

我在设置时有一个索引:SESSION['map_id'] = foo

然后索引文件加载一个闪存文件。初始化时,闪存访问一个“Authenticate.php”文件,该文件回显SESSION['map_id'],并通过LoadVars 加载到闪存中。 Flash 然后显示适当的数据。 此步骤不能以其他方式完成

这一切都可以在我们的主站点上正常运行。当我们尝试通过提供 iframe 嵌入代码来移植到其他网站时,就会出现问题:

<iframe src="http://www.mydomain.com/?map_id=foo&code=bar" ... ></iframe>

在从另一个站点 (www.anotherdomain.com) 重新加载嵌入代码时,SESSION 变量似乎已被破坏,因为 flash 只是说它们是空的。 ($map_id 输出空白)

索引文件仍会正确地将$map_id 回显为“foo”,只是似乎“Authenticate.php”文件无法访问SESSION 变量。

我已确保 session_start() 出现在所有适当的文件中。

【问题讨论】:

    标签: php iframe cross-domain session-variables


    【解决方案1】:

    默认情况下,PHP 会话 ID 通过 cookie 传递,但您不能跨域传输 cookie。尝试通过 url 传递会话 ID。

    Here is the appropriate page in the php documentation.

    如果不是自动完成,有几种方法可以让 php 在 url 中传递会话 id。

    1. 您可以在url中手动传递会话ID(必须在其他get变量之前):

    2. 您可以禁用 cookie,强制每个请求将会话 ID 自动添加到 url:

      ini_set("session.use_cookies","0");

    3. 您可以编辑 url_rewriter.tags 设置,它告诉 PHP 哪些 html 标记要用会话 ID 重写。此处,iframe=src 已添加到默认集:

      ini_set("url_rewriter.tags", "a=href,area=href,frame=src,iframe=src,input=src,form=fakeentry");

    【讨论】:

    • 那么,由于会话 ID 不是第一次通过 cookie 传递,会话变量不知道它们属于哪个会话?如果我通过 URL 传递会话 id,我可以告诉会话它是 id?
    • 这就是它的要点。我已经更新了我的回复,以便更清楚地说明如何做到这一点。
    • 这是一个相当敏感的解决方案,因为我们正在向公众开放它。它可能会被插入到带有 blogspot 类型编辑器的某人的页面上。无论如何,这可以通过我们的页面来完成吗?
    • 我不确定。如果客户端禁用了 cookie,PHP 会自动将会话 ID 附加到 url。也许您可以尝试通过设置 ini_set("session.use_cookies","0"); 来强制执行此行为。在你的最后。我不确定这是否有效,但如果有效,请回帖,我将编辑我的答案以包含此解决方案。
    • 这适用于链接。但是 JS AJAX 调用呢?如何“轻松处理”它们?
    猜你喜欢
    • 1970-01-01
    • 2010-11-20
    • 1970-01-01
    • 2014-06-30
    • 2013-08-25
    • 2012-03-12
    相关资源
    最近更新 更多