我的生产服务器出现了奇怪的情况。但是,这在我的本地开发环境中不是问题。这是一个测试脚本,我可以用它来复制问题:
<?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)。
答案 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
变量由变量组成。