即使会话ID正确,PHP会话也是空的

时间:2011-02-21 15:17:41

标签: php ajax flash session

昨天我搜索了几乎所有关于php会话的主题,我查看了手册但它仍然无法正常工作。因此,我熬夜很晚。

场景是:我使用标准的html表单登录。我的会话填充了一些变量,它工作正常。然后我使用Flash uploadify上传一些照片,然后传递参数 - PHPSESSID。我的php脚本无法识别会话。它认为它是空的。然后我尝试使用FirefoxOpera这样的不同客户端进行该会话,它也是空的。然后,我尝试使用不同的Chrome标签进行该会话,运行

如你所见,我唯一的保护是IP。我不会扫描其他内容,因此当传递良好的PHPSESSID并且客户端IP匹配时,无论客户端类型,版本等是否匹配,都应该

这是init_session.php,我每次在其他文件的开头都包含文件。因此,我知道会话ID正在通过Flash传递。但是会议是空的。

目录设置在顶部,路径是直接的,所以不应该有任何问题。当默认保存路径时,它也不起作用。我还改变了会话自动启动和会话仅使用cookie。它没有改变,除了我需要手动设置cookie。

这里有什么我可以尝试的吗?我想我没有选择。

编辑:
我忘记了大多数importat的事情我认为关闭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因为我需要复制oryginal php5.ini并替换一些变量以使其正常工作。

问题符合预期suhosin.session.cryptua

2 个答案:

答案 0 :(得分:2)

正如弗罗德在评论中所说,我将此作为答案。

使用任何 Flash脚本时,可能会发生这种情况,而不仅仅是uploadify。除非用户代理字段相同,否则任何其他闪存上传程序(例如SWFUpload)都不会获得会话。

当您的服务器安装了suhosin补丁时会发生这种情况,但有时即使设置suhosin.session.cryptua已建议alecgorge启用,也不会出现此问题。虽然我不相信这一点。当然你可以使用php脚本传递flash这个变量来发现用户浏览器的用户代理,然后flash可以伪装成同一个浏览器,但它不是优雅的解决方案,我不知道动作脚本所以我不能说是闪存实际上可以做到。

非常重要: 实际上两个设置可以修复此安全补丁。

  1. suhosin.session.encrypt
  2. suhosin.session.cryptua
  3. 如果第一个被禁用,则会话根本不加密,因此不会出现问题。不建议禁用此功能。如果我们仅禁用第二个会话,则会话将被加密,但加密将不会在用户代理字段上进行中继。这意味着任何浏览器或http客户端都可以获得任何会话。因此,建议放置一些其他安全字段。 Suhosin还可以处理会话IP保护,因此我建议启用suhosin.session.cryptraddr。其他设置可以在这里找到:
    Suhosin configuration

    要解决此问题,我建议:

    1. 如果安装了suhosin,请检查phpinfo()。如果没有,则不会发生问题。
    2. 如果安装了suhosin并且启用了suhosin.session.cryptuasuhosin.session.encrypt,则复制现有的和正在运行的php.ini。它位于php信息页面的顶部:Loaded Configuration File /public_html/php5.ini
    3. 创建自己的php.ini并设置:
      • suhosin.session.encrypt = On
      • suhosin.session.cryptraddr = On
      • suhosin.session.cryptua = Off

答案 1 :(得分:0)

通常使用Uploadify,我必须做这样的事情:

$('#uploadify').uploadify('scriptData':{'session_name':'<?php echo session_id(); ?>'}});

在客户端上与服务器端的这类内容结合使用:

if($_POST['session_name']) {
    session_id($_POST['session_name']);
}
session_start();