昨天我搜索了几乎所有关于php会话的主题,我查看了手册但它仍然无法正常工作。因此,我熬夜很晚。
场景是:我使用标准的html表单登录。我的会话填充了一些变量,它工作正常。然后我使用Flash uploadify
上传一些照片,然后传递参数 - PHPSESSID
。我的php脚本无法识别会话。它认为它是空的。然后我尝试使用Firefox
或Opera
这样的不同客户端进行该会话,它也是空的。然后,我尝试使用不同的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
答案 0 :(得分:2)
正如弗罗德在评论中所说,我将此作为答案。
使用任何 Flash脚本时,可能会发生这种情况,而不仅仅是uploadify。除非用户代理字段相同,否则任何其他闪存上传程序(例如SWFUpload
)都不会获得会话。
当您的服务器安装了suhosin
补丁时会发生这种情况,但有时即使设置suhosin.session.cryptua
已建议alecgorge
启用,也不会出现此问题。虽然我不相信这一点。当然你可以使用php脚本传递flash这个变量来发现用户浏览器的用户代理,然后flash可以伪装成同一个浏览器,但它不是优雅的解决方案,我不知道动作脚本所以我不能说是闪存实际上可以做到。
非常重要: 实际上两个设置可以修复此安全补丁。
如果第一个被禁用,则会话根本不加密,因此不会出现问题。不建议禁用此功能。如果我们仅禁用第二个会话,则会话将被加密,但加密将不会在用户代理字段上进行中继。这意味着任何浏览器或http客户端都可以获得任何会话。因此,建议放置一些其他安全字段。 Suhosin还可以处理会话IP保护,因此我建议启用suhosin.session.cryptraddr
。其他设置可以在这里找到:
Suhosin configuration
要解决此问题,我建议:
suhosin.session.cryptua
和suhosin.session.encrypt
,则复制现有的和正在运行的php.ini。它位于php信息页面的顶部:Loaded Configuration File /public_html/php5.ini
答案 1 :(得分:0)
通常使用Uploadify,我必须做这样的事情:
$('#uploadify').uploadify('scriptData':{'session_name':'<?php echo session_id(); ?>'}});
在客户端上与服务器端的这类内容结合使用:
if($_POST['session_name']) {
session_id($_POST['session_name']);
}
session_start();