2011-02-21 47 views
1

昨天我搜索了几乎所有关于php会话的主题,我查看了手册,但仍然无法正常工作。因为这个,我熬夜很晚。即使会话ID正确,PHP会话也是空的

情景是:我使用标准的HTML表单登录。我的会话中填充了一些变量,它工作正常。然后我使用闪存uploadify上传一些照片,并通过参数 - PHPSESSID。我的PHP脚本不识别会话。它认为它是空的。然后我尝试使用不同客户端的会话,例如FirefoxOpera,并且它也是空的。然后我尝试使用不同的Chrome选项卡和它的工作

正如你看到我唯一的保护是通过IP。我不扫描其他的事情,所以当好PHPSESSID传递也不管客户端类型,版本等

这是init_session.php,文件的客户端IP是匹配我包括其他文件开始时每次这个应该工作。因此我知道会话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

+0

呃......当你只关注技术上必要的基础知识时,你能初始化一个会话吗?如果是,则描述没有所有雾的症状,如果不是,则尝试在另一个之后添加一个技术细节直到问题再次出现。 – Raffael

+0

工作的正常请求和uploadify提出的请求之间有什么区别?例如。你是通过相同的主机名/子域请求脚本吗? – Frode

+0

请参阅更新。我忘了提及,但主要的不同之处在于**用户代理字段**,因为其他浏览器也不工作 – Kaminari

回答

2

正如Frode在他的评论中所建议的,我将这作为一个swer。

这可能发生在使用任何 Flash脚本,而不只是uploadify。除非用户代理字段相同,否则任何其他Flash上​​传程序(如SWFUpload)都不会获得该会话。

这发生在你的服务器上安装补丁suhosin但似乎有时即使设置suhosin.session.cryptua启用为alecgorge建议不会发生此问题。虽然我不相信这一点。当然,你可以通过使用PHP脚本来传递这个变量来发现用户浏览器的用户代理,然后Flash可以将自己伪装成同一浏览器,但这不是优雅的解决方案,我不知道动作,所以我不能说闪光实际上可以做到。

非常重要: 实际上有设置,可以修复此安全修补程序。

  1. suhosin.session.encrypt
  2. suhosin.session.cryptua

如果第一个是禁用,则会话并不因此不会出现问题加密。不建议禁用此功能。如果我们只禁用第二个,那么会话将被加密,但加密不会在用户代理字段上中继。这意味着任何浏览器或http客户端都可以获得任何会话。因此建议放置一些其他安全字段。 Suhosin也可以处理会话ip保护,因此我建议启用suhosin.session.cryptraddr。其他设置可以在这里找到:如果安装了Suhosin

  1. 检查phpinfo()函数:
    Suhosin configuration

    要解决这个问题,我建议。如果没有,那么问题就不会发生。

  2. 如果安装了suhosin并且suhosin.session.cryptuasuhosin.session.encrypt已启用,请复制现有和正在运行的php.ini。这是对PHP的信息页面的顶部:Loaded Configuration File /public_html/php5.ini
  3. 创建您自己的php.ini,并设置:
    • suhosin.session.encrypt =在
    • suhosin.session.cryptraddr =在
    • suhosin.session。 cryptua = Off
+0

请注意使用启用suhosin.session.cryptraddr可能会中断访问某些代理的访问者(某些公司代理在多个代理服务器之间以非粘性方式平衡用户连接,每个代理服务器具有不同的IP)。 –

0

通常与Uploadify我必须做​​这样的事情:

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

在客户端结合在服务器端是这样的:

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

当然,我发送带有uploadify参数的会话ID。请阅读全文并更新。我认为suhosin就是这种情况。 – Kaminari

+0

哦,我读了所有的东西。只是这是一个非常常见的错误,通常当人们认为他们已经避免了这个陷阱时,他们经常会陷入其中。是否将会话作为名为PHPSESSID的获取变量发送?尝试将其称为别的东西,然后像这样发布。然后删除刮过后得到的东西和Cookie的PHPSESSID。 –

+0

另外,我在启用了'suhosin.session.cryptua'的服务器上使用它,我没有问题。 –