POST后,PHP session_id()发生了变化

时间:2015-10-15 16:35:00

标签: php session

我的生产服务器出现了奇怪的情况。但是,这在我的本地开发环境中不是问题。这是一个测试脚本,我可以用它来复制问题:

<?php

session_start();

$_SESSION['test'] = 'test';

echo 'session_id(): '.session_id();

session_write_close();

?>

<form method="POST">
    <input type="submit" value="Post to self" />
</form>

如果我在浏览器中加载此页面并刷新页面(CTRL + R),我每次都会显示相同的session_id()值。

然而,如果我然后单击提交按钮,我会得到两个不同的结果:

  • 开发:相同的session_id()值(预期结果)。
  • 制作:不同 session_id()值。

此外,在生产服务器上,如果我再次重新加载页面,则会返回原始 session_id()值。

如何让生产服务器保持session_id()值?任何建议都将不胜感激。

谢谢!

评论详情 在我发布的基本示例中,它是这样的:

array(5) { 
         ["lifetime"]=> int(0) 
         ["path"]=> string(1) "/" 
         ["domain"]=> string(0) "" 
         ["secure"]=> bool(false) 
         ["httponly"]=> bool(false) 
         }

在实际的生产代码中,它是这样的:

array(5) { 
         ["lifetime"]=> int(0) 
         ["path"]=> string(1) "/" 
         ["domain"]=> string(0) "" 
         ["secure"]=> bool(true) 
         ["httponly"]=> bool(true) 
         }

(我在生产中使用HTTPS)。

3 个答案:

答案 0 :(得分:0)

最安全的方法是告诉PHP使用cookie。要求用户允许会话coookies。

session_name(SESSION_NAME);

// PHP 5.2+ Prevent x-domain cookie sess theft. Dont let Client scripts see cookie
$HTTPONLY = 1; // 0 or 1;

if (function_exists('session_set_cookie_params')) 
{
    session_set_cookie_params(3600, '/', '.domain.com', 0, $HTTPONLY);
} elseif (function_exists('ini_set')) 
{
    ini_set('session.cookie_lifetime', 3600);
    ini_set('session.cookie_path', '/');
    ini_set('session.cookie_domain', '.domain.com');

    ini_set('session.cookie_httponly', $HTTPONLY);
}

您还可以通过表单变量继续传递SESSION_ID,但这不安全。

答案 1 :(得分:0)

对不起大家;野鹅追逐。根据我主持人的建议,我运行EasyApache将服务器升级到PHP到v5.5。在这样做时,PHP处理程序无意中被切换到了除SuPHP以外的其他东西,因此在/tmp中的会话文件上有读取权限问题。结果,PHP不断生成新的会话文件。

编辑:我还应该注意is_writable(session_save_path())正在返回 true ,这是误导我对问题的理解。

答案 2 :(得分:-1)

// session_regenerate_id()

session_start();

    if(isset($_POST)){
        $_SESSION['IDONE'] = session_id();
        session_regenerate_id();
        $_SESSION['IDTWO'] = session_id();
        var_dump($_SESSION);
    }

将“name”属性设置为<input>标记,以便$_POST变量由变量组成。

PHP Manual