PHP – 使用session.use_trans_sid时会话ID更改

前端之家收集整理的这篇文章主要介绍了PHP – 使用session.use_trans_sid时会话ID更改前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我开发了一个使用基于cookie的会话的 PHP Web应用程序,它一切正常 – 直到我意识到它将无法在禁用第三方cookie的浏览器中工作(因为脚本将在iframe上加载另一个网站/域名).

所以我决定切换到基于URL的会话(我认为这是安全的,因为脚本在iframe中,没有可见的URL供用户共享或书签等).

但是,出于某种原因,由于我切换到基于域的会话,我的Web应用程序中的每个页面都使用不同的会话ID.

这是我的代码……

ini_set("session.use_cookies",0);
ini_set("session.use_only_cookies",0);
ini_set("session.use_trans_sid",1);
ini_set("session.cache_limiter","");
session_start();
echo "<p>Session ID: " . session_id() . "</p>"; // Test output

…这是在每个页面调用的第一件事(没有我以前的输出).

我的Web应用程序的第一页包含一个表单,我看到PHP自动添加了所需的隐藏会话ID输入:

< input type =“hidden”name =“PHPSESSID”value =“m4jbeec47uplnf95ue2h244a02”/>

但是下一页(表单提交)报告的会话ID是

会话ID:iiovfkrf3hesj1um5orasv7it6

此外,当我使用https://(而不是http://)加载第一页时,提交表单会导致重新加载相同的页面(而不是正在加载的下一页).

我已经尝试过的:

ini_set(“session.cookie_secure”,0);

ini_set(“session.cookie_secure”,1);

ini_set(‘session.gc_maxlifetime’,30 * 60); //在30分钟后到期

和(在脚本的末尾)

session_write_close();

删除

ini_set(“session.cache_limiter”,“”);

来自PHPinfo():

session.auto_start  Off Off
session.cache_expire    180 180
session.cache_limiter   nocache nocache
session.cookie_domain   no value    no value
session.cookie_httponly Off Off
session.cookie_lifetime 0   0
session.cookie_path /   /
session.cookie_secure   Off Off
session.entropy_file    no value    no value
session.entropy_length  0   0
session.gc_divisor  1000    1000
session.gc_maxlifetime  1440    1440
session.gc_probability  1   1
session.hash_bits_per_character 5   5
session.hash_function   0   0
session.name    PHPSESSID   PHPSESSID
session.referer_check   no value    no value
session.save_handler    files   files
session.save_path   /tmp    /tmp
session.serialize_handler   PHP PHP
session.upload_progress.cleanup On  On
session.upload_progress.enabled On  On
session.upload_progress.freq    1%  1%
session.upload_progress.min_freq    1   1
session.upload_progress.name    PHP_SESSION_UPLOAD_PROGRESS PHP_SESSION_UPLOAD_PROGRESS
session.upload_progress.prefix  upload_progress_    upload_progress_
session.use_cookies On  On
session.use_only_cookies    On  On
session.use_strict_mode Off Off
session.use_trans_sid   0   0

有任何想法吗?

我认为问题必定是由于我的代码中的某个错误.我在下面创建了测试脚本,它按预期工作(在同一台服务器上):

URL的会话test.PHP

<?PHP

$page_title = "URL Session Test (v11)";

ini_set("session.use_cookies",1);
//ini_set("session.cache_limiter","");
ini_set('session.gc_maxlifetime',30 * 60); // expires in 30 minutes
session_start();
$session_id = session_id();

$is_new_session = !isset($_SESSION["existing"]);
$_SESSION["existing"] = true;
if ($is_new_session) {
    $_SESSION["my_key"] = "MY PRIVATE KEY";
}
$my_session_key = $_SESSION["my_key"];

$timezone = $_SESSION["timezone"];
if ($timezone) {
    date_default_timezone_set($timezone);
}

if ($_POST['PHPSESSID']) {
    $session_id_received = $_POST['PHPSESSID'];
}
else {
    $session_id_received = "";
}

?><!DOCTYPE html>
<html>
    <head>
        <title><?PHP echo $page_title; ?></title>
    </head>
    <body>
        <h1><?PHP echo $page_title; ?></h1>
        <p>Is new session: <?PHP echo $is_new_session; ?></p>
        <p>My session key: <?PHP echo $my_session_key; ?></p>
        <p>Received session ID: <?PHP echo $session_id_received; ?></p>
        <p>Actual session ID: <?PHP echo $session_id; ?></p>
        <form method="POST">
            <input type="submit" value="Click this form submit button to see how if the above session ID is received by the next page" />
        </form>
        <a href="url-session-test.PHP">Hover over this link to check the session ID parameter</a> 
    </body>
</html>

我发现它后会发布实际的bug …

UPDATE

问题是我使用的是POST-Redirect-GET模型,而我没有将所需的PHPSESSID参数附加到GET URL!

猜你在找的PHP相关文章