0

我有一个 check_session.php 文件,用于检查用户会话是否在登录后启动,情况如下:

有两个网址:

https://www.website.com/control/user/

它里面有一个指向另一个 URL 的链接:

https://www.website.com/b2b/user/

在每一页的开头你甚至有代码:

<?php
if( !session_id() ) {
    session_start();
}
header('Access-Control-Allow-Origin: https://www.website.com');
?>

文件 check_session.php 对于两种环境都是相同的,但是当在 target="_blank" 中打开链接时,另一个 URL 通过文件 verify.php 并且 $_SESSION['user'] 无法识别并转发用户退出环境,但源选项卡不会丢失会话:

<?php
if( !isset($_SESSION['user']) ) {
    session_regenerate_id(true);
    unset($_SESSION['user']);
    session_destroy();
    session_start();
    echo "<script>window.alert('Unauthorized access [SECTION OFF]!');</script>";
    echo "<script>parent.location.href='home/';</script>";
    exit();
}
?>

考虑到目标 URL 调用是通过标签和 Jquery .ajax() 完成的;

非常感谢,谢谢!

4

1 回答 1

1

这可能发生在两种情况下:首先是不同的域名。你说,他们是一样的。

那么很可能你没有在 verify.php 中初始化会话

Access-Control-Allow-Origin当您需要从另一个站点加载数据时使用标头。您不需要在同一域上使用该标头。而且您无需session_id在开始会话之前进行检查。

所以第一段代码可能如下所示:

<?php session_start(); ?>

在第二段代码中,如果$_SESSION['user']没有设置,那么unset($_SESSION['user']);.

如果您销毁会话,则无需session_regenerate_id(true);.

如果您重新创建会话只是因为$_SESSION['user']并且此代码都在此文件中,

那么第二段代码可能如下所示:

<?php
session_start();
if(!isset($_SESSION['user']) ) {
    echo "<script>window.alert('Unauthorized access [SECTION OFF]!');</script>";
    echo "<script>parent.location.href='home/';</script>";
}

如果您出于其他原因重新创建会话,则第二部分可能如下所示:

<?php
session_start();
if( !isset($_SESSION['user']) ) {
    session_destroy();
    session_start();
    echo "<script>window.alert('Unauthorized access [SECTION OFF]!');</script>";
    echo "<script>parent.location.href='home/';</script>";
}
于 2018-05-29T20:13:08.673 回答