【问题标题】:php session & iframephp 会话和 iframe
【发布时间】:2012-02-15 23:37:10
【问题描述】:

我在这里阅读了几篇相关的帖子,但似乎无法让我的脚本按预期工作。

我有一个用户登录的登录页面。如果密码匹配,脚本会将两个值写入$_SESSION 变量:['loggedin']='yes'['loginname']="username"

成功登录后,用户转到另一个页面,其中包含 2 个 iframe。

一个 iframe 使用外部内容并且不需要身份验证(从页面中删除此 iframe 不会改变任何内容)。

另一个 iframe 使用来自同一域的动态生成的内容,并检查会话变量是否仍然存在。

其中一个函数会刷新动态生成的 iframe 的内容。

一旦完成,会话变量就会丢失。事实上,会话本身已经不存在了。

我在与此脚本相关的每个页面上都有session_start();

任何帮助将不胜感激。

【问题讨论】:

  • 如果你在 iframe 页面上有 session_start(),你应该没有问题。
  • 我遇到了一个问题,即基于 cookie 的会话在我的 iframe 中不起作用。这是因为我正在测试的浏览器禁用了第三方 cookie

标签: php session iframe


【解决方案1】:

我相信这篇文章会很有用: http://www.how2guru.com/archives/php-session-problem-while-using-iframe/

简短的回答是:在 iframe 中,像这样开始会话:

header('P3P: CP="CAO PSA OUR"');
session_start();

编辑:

我想我应该更新这个答案,因为我偶然发现了一些每个人都应该知道的有趣的事情。

此 p3p 标头 hack不适用于 safari

下面我描述了我的登录流程,以及我是如何解决这个问题的。

我的登录流程如下所示(页面应用):

  • 检查当前用户是否有会话,
  • 如果没有,则重定向到登录网址(由 PHP SDK 生成),
  • 登录对话框重定向回一个 url,我使用 'code' GET 参数 facebook 给我,获取访问令牌,我可以存储以供以后使用。 (保存到数据库到会话。)如果我完成了,我将用户重定向到我的页面应用程序,一切都会工作。
  • 此时每个人都应该感到高兴。

但是问题来了。

如果用户使用 safari,并在会话已被破坏时(例如几天后)尝试打开此应用,则会发生以下情况:

  • 代码检查会话:它找到用户 ID(PHP SDK getUser() 方法),所以我首先检查数据库中的条目。
  • 由于用户之前登录过,他在数据库中有一个条目,所以我只是抓取它并将其保存到会话中,这样以后的 AJAX 调用将拥有他们需要的所有信息。

这里要注意的重要一点是,此代码在 iframe 内的页面选项卡中运行。

因此对于大多数用户而言,由于 p3p 标头 hack,该代码将起作用。

但对于 safari 用户来说不会。

Safari 不关心给定的标头,它拒绝保存会话,因此用户登录到应用程序,一切似乎都工作正常,但 ajax 调用不起作用,因为它们没有任何可以使用的会话。

解决方法:

实际上很简单 - 虽然不是太优雅,但是嘿,它有效。 -:我检查客户端浏览器是否是 safari,如果是,我会重定向到自定义 url,在那里我开始一个会话 - 在 facebook iframe 之外 - 然后重定向回应用程序。

这将毫无问题地创建 cookie,因此会话将可用。

这里有一些代码:

  • 检查会话 (Credit goes to this guy)

    if (strpos($_SERVER['HTTP_USER_AGENT'], 'Safari') && !strpos($_SERVER['HTTP_USER_AGENT'], 'Chrome')) {
        if (count($_COOKIE) === 0) {
         echo '<script> 
         top.location = "http://www.domain.com/setcookie.php";
         </script>';
        }
    }
    
  • 设置会话(setcookie.php)

    header('P3P: CP="CAO PSA OUR"');
    session_start();
    $_SESSION = array();
    
    echo 
    '<script>
    top.location = "http://back-to-the-facebook-app.com"; 
    </script>';
    

我希望这个额外的技巧对某人有所帮助。

EDIT2

我还没有尝试过这个,但是您可以在 .htaccess 中添加以下行,而不是添加 P3P 标头:

 <IfModule mod_headers.c>
   Header set P3P "policyref=\"/w3c/p3p.xml\", CP=\"IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT\""
 </IfModule>

使用 cmets:

# ------------------------------------------------------------------------------
# | Cookie setting from iframes                                                |
# ------------------------------------------------------------------------------

# Allow cookies to be set from iframes in IE.
# http://msdn.microsoft.com/en-us/library/ms537343.aspx
# http://www.w3.org/TR/2000/CR-P3P-20001215/

<IfModule mod_headers.c>
  Header set P3P "policyref=\"/w3c/p3p.xml\", CP=\"IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT\""
</IfModule>

Yeoman 项目背后的人的所有功劳都归功于这个 .htacces 代码。

【讨论】:

  • 对于 http/server/location 块中的 nginx 添加 add_header P3P 'policyref="/w3c/p3p.xml", CP="IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT ", CP="CAO PSA OUR"';
  • Saulius - 这也适用于野生动物园吗?对我来说它没有帮助或者我做错了什么
【解决方案2】:

将以下内容添加到框架中的每个页面:

echo "Session ID: ".session_id();

这应该在每个页面上输出会话 ID。可能会在其中一个帧上生成一个新会话,通过检查上述内容,您可以排除这种可能性。

【讨论】:

  • 好的,我添加了那行,结果让我震惊。 session_id 是相同的,但是脚本以某种方式使 if ($_SESSION) 条件失败。所以我有这个代码:if (!$_SESSION) { echo "no session"; echo session_id(); }。令人惊讶的是,我得到以下输出:“no sessionSession ID: 2c49b03084d3a5112e332e0d53008650” 在正常情况下,“no session”代码会触发用户返回身份验证阶段。 $_SESSION 变量怎么可能是空的,但会话 id 仍然存在?
  • 哇,太尴尬了。 isset 修复了这个条件。但是我仍然有变量消失的问题,因为现在它失败了另一个条件:if (($_SESSION['AdminLoggedIn']!="YES") || ($_SESSION['AdminName']=="")) {
  • 这是一个重要的区别......这是我今天第二次看到“if (!$var)”被假定为与“if(!isset( $var))",并且很容易理解为什么人们会认为如果没有设置某些东西,它一定是假的。这里有一个很好的说明:stackoverflow.com/questions/844410/whats-better-isset-or-not
  • @Leo Haris - 你知道为什么实际的会话变量可能会丢失吗?
  • 会话 id 保持不变,但是一旦表单被提交,会话数组本身就是空的......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-09-11
  • 1970-01-01
  • 2010-12-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多