【发布时间】:2011-02-21 15:17:40
【问题描述】:
昨天我几乎搜索了所有关于 php 会话的主题,我查看了手册,它仍然没有用。因此我熬夜很晚。
场景是:我使用标准的 html 表单登录。我的会话填充了一些变量,并且工作正常。然后我使用 Flash uploadify 上传一些照片,并通过参数 - PHPSESSID。我的 php 脚本无法识别会话。它认为它是空的。然后我尝试与不同的客户端进行该会话,例如Firefox 或Opera,它也是空的。然后我尝试使用不同的Chrome 选项卡进行该会话,并且它可以工作
如您所见,我唯一的保护是通过 IP。我不扫描其他东西,所以当通过良好的 PHPSESSID 并且客户端 IP 匹配时,无论客户端类型、版本等如何,这应该可以工作。
这是init_session.php,我每次都包含在其他文件开头的文件。因此,我知道会话 ID 是通过 Flash 传递的。但是会话是空的。
目录设置在顶部,路径是直接的,所以应该没有任何问题。当保存路径为默认值时,它也不起作用。我还关闭了会话自动启动和会话仅使用 cookie。除了我需要手动设置 cookie 之外,它并没有改变什么。
这里有什么我可以尝试的吗?我想我已经没有选择了。
编辑:
我忘记了最重要的事情,我认为关闭 suhosin.session.cryptua 可以解决问题,但我无法使用 ini_set 将其关闭,还有其他方法吗?似乎这个选项使用用户代理字段加密会话就是这种情况。
ini_set('session.auto_start', '0');
ini_set('session.save_path','/public_html/nowy/tmp');
if (isset($_POST["PHPSESSID"])) {
session_id($_POST["PHPSESSID"]);
} elseif (isset($_COOKIE['PHPSESSID'])) {
session_id($_COOKIE["PHPSESSID"]);
} elseif (isset($_GET["PHPSESSID"])) {
session_id($_GET["PHPSESSID"]);
}
session_start();
setcookie("PHPSESSID", session_id(), time()+3600, "/");
if (!isset($_SESSION['user'])) {
$_SESSION['user'] = 0;
}
if (!isset($_SESSION['initiate'])) {
session_regenerate_id();
$_SESSION['initiate'] = true;
$_SESSION['ip'] = $_SERVER['REMOTE_ADDR'];
}
echo ini_get('session.save_path').'<br />';
echo $_POST["PHPSESSID"];
print_r($_SESSION);
已解决
这个问题已经解决了。我无法将cryptua 设置为关闭,因为我需要复制原始的php5.ini 并替换一些变量以使其正常工作。
问题出乎意料suhosin.session.cryptua
【问题讨论】:
-
嗯......当您只关注技术上必要的基础知识时,您可以初始化会话吗?如果是,那么描述症状时不要出现所有的迷雾,如果不是,则尝试一个接一个地添加技术细节,直到问题再次出现。
-
正常的请求和uploadify发出的请求有什么区别?例如。您是否通过相同的主机名/子域请求脚本?
-
请查看更新。我忘了提,但主要的不同是 user-agent 字段,因为其他浏览器也不起作用