我有第一个站点https://www.mydomain1.com我在其中使用PHP会话。没问题,一切都很好,当我从一页转到另一页时,我可以访问我的会话变量。
我有第二个网站https://www.mydomain1.com其中我通过iframe:显示了我的第一个网站的一部分
<iframe src = "https://www.mydomain1.com" width = "100%" frameborder = "0" style = "border: 0" allowfullscreen = "allowfullscreen" id = "frameLeonard"> </iframe>
奇怪的是,会话变量不再被识别。我甚至没有试图让我的第一个站点从第二个站点访问会话变量(这不是目标,它不起作用是正常的(,而是在第一个站点内运行第二个网站。
奇怪的是,一年前它还在工作。是否有任何升级可以解释这个问题?
提前感谢您的灯光!
现在我找到了原因,chrome显示了这种行为。在版本80(2020年2月(中;SameSite默认cookie";默认情况下启用,这意味着在iframe中包含外部页面(不同的域(将终止它们的会话。
为了防止这种情况,您可以禁用";SameSite默认cookie";在里面chrome://flags小心:这可能是一个安全问题(但现在解决了我的问题(
否则,如果使用PHP 7.3或更新版本,您可以在session_start()
:之前在PHP中添加以下ini_set()
中的一个(或两个(
ini_set('session.cookie_samesite', 'None');
session_set_cookie_params(['samesite' => 'None']);
在这里您可以获得更多详细信息:https://blog.heroku.com/chrome-changes-samesite-cookie#prepare-for-cochrome-80更新
我建议您使用MySQL函数,
//通过img文件添加captcha记录。
$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; } }
//在进程文件上匹配captcha代码
$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 */ }
这里也有同样的问题,但还没有解决方案。我做了几次测试。似乎只有当iFrame加载的内容经过SSL认证时才会发生。如果没有,那就完美了。也许这很有帮助。或者你找到解决方案了吗?