PHP session 和 iframe

标签 php session iframe

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

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

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

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

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

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

完成此操作后, session 变量将丢失。事实上, session 本身已经不存在了。

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

如有任何帮助,我们将不胜感激。

最佳答案

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

简短的回答是:在 iframe 中,像这样启动 session :

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

编辑:

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

这个 p3p header hack 不适用于 safari

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

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

  • 检查当前用户是否有 session ,
  • 如果不是,则重定向到登录 url(由 PHP SDK 生成),
  • 登录对话框重定向回一个 url,我在其中使用 facebook 给我的“代码”GET 参数来获取访问 token ,我可以存储该 token 供以后使用。 (保存到数据库 到 session 。)如果我完成了这些,我会将用户重定向到我的页面应用程序,在那里一切都会正常工作。
  • 此时每个人都应该感到高兴。

但是问题来了。

如果用户使用 safari,并在 session 已经被销毁时(例如几天后)尝试打开此应用,将会发生以下情况:

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

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

因此对于大多数用户而言,由于 p3p header hack,代码将有效。

但对于 safari 用户来说不会。

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

解决方法:

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

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

在这里,有一些代码:

  • 检查 session (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>';
        }
    }
    
  • 设置 session (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

我还没有尝试过这个,但是除了添加 P3P header 之外,您还可以将以下行添加到您的 .htaccess 中:

 <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>

附评论:

# ------------------------------------------------------------------------------
# | 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 代码付出了所有的功劳项目。

关于PHP session 和 iframe,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8957769/

相关文章:

javascript - 如何在嵌入文件中使用 php session ?

html - 从另一个域预填充 iframe 表单

javascript - iframe 无法与表单中的标签一起使用

javascript - 写入 iframe 会导致浏览器使用不同的 url 重新加载

php - 如何清除或清空 doctrine symfony 中的 Array Collection

php - $_SESSION 变量没有保存在托管服务器上,但在我的本地主机上运行完美且符合预期

asp.net - span innertext 甚至不在同一页面中分配

session - 如何在用户单击返回时显示自定义 session 过期页面?

php - 仅为特定目录启用 APC?

php - Magento 批量价格变动