【问题标题】:Sessions are not working when the site is called by an iframe当网站被 iframe 调用时,会话不起作用
【发布时间】:2020-09-23 08:04:04
【问题描述】:

我有一个使用 PHP 会话的第一个站点 https://www.mydomain1.com。没问题,一切正常,当我从一个页面转到另一个页面时,我可以访问我的会话变量。

我有第二个站点 https://www.mydomain1.com,我在其中通过 iframe 显示我的第一个站点的一部分:

<iframe src = "https://www.mydomain1.com" width = "100%" frameborder = "0" style = "border: 0" allowfullscreen = "allowfullscreen" id = "frameLeonard"> </iframe>

奇怪的是,会话变量不再被识别。我什至没有试图让我的第一个站点从第二个站点访问会话变量(这不是目标,它不起作用是正常的),而只是在第一个站点内运行第二个站点。

奇怪的是,它在一年前仍然有效。 是否有任何升级可以解释该问题?

提前感谢您的灯!

【问题讨论】:

  • 什么不再起作用了?你确定不只是“第二个站点”上没有开始会话吗?
  • 会话在没有 iframe 的情况下实时运行时在第二个站点上启动良好。但是,当它被 iframe 调用时,会话不会启动。经检查,问题在 Chrome 上存在,但在 Firefox 上不存在。

标签: php session iframe


【解决方案1】:

现在我找到了原因,chrome 显示了这种行为。在 80 版(2020 年 2 月)中,默认启用了“默认情况下相同的 cookie”,这意味着在 iframe 中包含外部页面(不同域)会终止他们的会话。

为了防止这种情况,您可以在 chrome://flags 中禁用“默认的 SameSite cookie” 当心:这可能是一个安全问题(但现在解决了我的问题)

否则 - 如果使用 PHP 7.3 或更新版本 - 您可以在您的 PHP 中的session_start() 之前添加以下ini_set() 之一(或两者):

ini_set('session.cookie_samesite', 'None');
session_set_cookie_params(['samesite' => 'None']);

您可以在此处获得更多详细信息: https://blog.heroku.com/chrome-changes-samesite-cookie#prepare-for-chrome-80-updates

【讨论】:

    【解决方案2】:

    这里有同样的问题,但还没有解决方案。 我做了几个测试。似乎只发生在 iFrame 加载的内容经过 SSL 认证时。如果没有,它会完美运行。 也许这很有帮助。或者你有什么解决办法吗?

    【讨论】:

      【解决方案3】:

      我建议你使用 MySQL 函数,

      //通过img文件添加验证码记录。

      $time = time();
      $deltime = time()-1500;
      $ip = $_SERVER['REMOTE_ADDR'];
      
          $result = $conn->query("SELECT * FROM `captcha` WHERE `ip` = '" . $ip . "'");
          if (($result) && ($result->num_rows >= 1))
          { 
              $conn->query("UPDATE `captcha` SET `captcha` = '".$_SESSION["captcha"]."' WHERE `ip` = '".$ip."'");
        }
        else 
        {
            
      $conn->query("DELETE FROM `captcha` WHERE `time` < '".$deltime."'");
            
      $sql = "INSERT INTO `captcha` (captcha, ip, time) VALUES ('".$_SESSION["captcha"]."', '".$ip."', '".$time."')";
      
      if ($conn->query($sql) === TRUE) {
        //echo "New record created successfully";
      } else {
        //echo "Error: " . $sql . "<br>" . $conn->error;
      }
        }
      

      // 处理文件以匹配验证码

      $ip = $_SERVER['REMOTE_ADDR'];
      $result = $conn->query("SELECT * FROM `captcha` WHERE `ip` = '" . $ip . "'");
      while ($row = $result->fetch_assoc())
      { 
           $captcha = $row['captcha'];
      }
      if ($captcha == $_POST["access_token"]) { /* do anything */ }
      

      【讨论】:

      • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
      猜你喜欢
      • 1970-01-01
      • 2017-07-03
      • 1970-01-01
      • 1970-01-01
      • 2014-02-12
      • 2020-02-02
      • 2013-08-04
      • 1970-01-01
      • 2014-12-05
      相关资源
      最近更新 更多