我的生产服务器上出现了一个奇怪的情况。但是,在我的本地开发环境中,这不是一个问题。下面是一个测试脚本,我可以用它复制问题:
<?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()值。
但是,如果单击submit按钮,就会得到两种不同的结果:
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 )。
发布于 2015-10-21 10:27:40
对不起大家;疯狂的追逐。根据主机的建议,我运行了EasyApache将服务器升级到PHP5.5。在这样做的过程中,PHP处理程序无意中被切换到了SuPHP以外的其他东西,因此在/tmp中的会话文件上存在读取权限问题。因此,PHP不断地生成新的会话文件。
编辑:我还应该注意到,is_writable(session_save_path())正在返回true,这就是我对问题的错误理解。
发布于 2015-10-15 19:13:05
最安全的方法是告诉PHP使用cookie。要求用户允许会话厨师。
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,但这并不安全。
发布于 2015-10-15 16:49:45
// 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手册
https://stackoverflow.com/questions/33153908
复制相似问题