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

时间:2017-05-20 10:28:22

标签: php session

我开发了一个使用基于cookie的会话的PHP Web应用程序,它一切正常 - 直到我意识到它将无法在禁用第三方cookie的浏览器中工作(因为脚本将被加载另一个网站/域名上的iframe。

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

但是,出于某种原因,由于我切换到基于域的会话,我的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

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

我的网页应用中的第一页包含一个表单,我看到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); // expires in 30 minutes

和(在脚本的末尾)

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

有什么想法吗?

1 个答案:

答案 0 :(得分:3)

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

<强> URL-会话test.php的

<?php

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

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", "");
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>

一旦找到它就会发布实际的错误......

<强>更新

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