PHP Session Lost,suhosin不可更改

时间:2013-10-24 01:11:26

标签: php session suhosin

在Ubuntu 12.04,Apache2,PHP5服务器上安装了suhosin扩展。 (phpinfo page

这是一个专用服务器,通过自动更新提供最新的安全更新。

我创建了以下测试脚本(test script without setting suhosin conf

session_start();

$error = 0;
ob_implicit_flush(true);

if ($_GET['is'] == 'set'){
    session_set_cookie_params ( '3600','/','.theparentingplace.com',false, false );
    error_log( "Old 'suhosin.session.encrypt': " . print_r( ini_set('suhosin.session.encrypt', 0), true) );    
    error_log( "Old 'suhosin.session.cryptdocroot': " . print_r( ini_set('suhosin.session.cryptdocroot', 0), true) );    
    error_log( "Old 'suhosin.cookie.cryptdocroot.': " . print_r( ini_set('suhosin.cookie.cryptdocroot', 0), true) );
}



if (empty($_SERVER['HTTPS']) && !$error){
    $_SESSION['test'] = 'abc';
    header('Location: https://'.$_SERVER['SERVER_NAME']
     .'/http_https_session_test.php');

}else{
    if ($_SESSION['test'] == 'abc'){
        print "Success." . $_SESSION['test'];
    }else{
        print "Fail.". print_r($_SESSION['test'],1);
    }
}

错误日志显示:

[Sat Oct 26 20:00:23 2013] [error] [client 103.29.31.35] Old 'suhosin.session.encrypt': 
[Sat Oct 26 20:00:23 2013] [error] [client 103.29.31.35] Old 'suhosin.session.cryptdocroot': 
[Sat Oct 26 20:00:23 2013] [error] [client 103.29.31.35] Old 'suhosin.cookie.cryptdocroot.'

其他SO帖子建议检查session.cookie_secure和session.http_only参数。两者都在此服务器上关闭。此外,我尝试实现关闭特定的suhosin设置,或者完全关闭suhosin与suhosin.simulation = On我在php.ini中尝试了这两个

此脚本返回失败。如果脚本使用is = set参数运行,则无法设置参数(test script 2

在另一台专用服务器上,测试脚本运行正常,即。 https url选择会话变量,但是这个服务器是Ubuntu 10.04。

知道接下来要做什么吗?

3 个答案:

答案 0 :(得分:1)

您尝试更改的选项(例如suhosin.cookie.cryptdocroot)会影响Suhosin在脚本开始运行之前执行的操作。因此,在运行时更改它们没有意义 - 您需要在php.ini或类似地设置它们。

答案 1 :(得分:1)

最近,当我将HTTP和HTTPS VirtualHost文件合并为一个并且出于安全原因将apache服务器更改为MPM-ITK时,我最近自行解决了这个问题。

在合并的VirtualHost文件中

<VirtualHost 120.138.18.91:80>
    ServerName www.theparentingplace.com

    DocumentRoot /var/www/www.theparentingplace.com/joomla
    CustomLog /var/log/apache2/www.theparentingplace.com-access.log   combined
    ErrorLog /var/log/apache2/www.theparentingplace.com-error.log

<IfModule mpm_itk_module>
    AssignUserId www-theparentingplace www-theparentingplace
</IfModule>

    RewriteEngine On
    RewriteCond %{QUERY_STRING} ^.*=(ht)|(f)+(tp)+(://|s://)+.*(\?\?)+
    RewriteRule .* http://gggooooooglleee.com/ [R,L]

    <FilesMatch "images/\.(asp|php|php5|pl)$">
        Deny from all
    </FilesMatch>
</VirtualHost>

<VirtualHost 120.138.18.91:443>
ServerName www.theparentingplace.com
    DocumentRoot /var/www/www.theparentingplace.com/joomla

CustomLog /var/log/apache2/www.theparentingplace.com-ssl-access.log combined
ErrorLog /var/log/apache2/www.theparentingplace.com-ssl-error.log

<IfModule mpm_itk_module>
    AssignUserId www-theparentingplace www-theparentingplace
</IfModule>

SSLEngine on
SSLCertificateFile /etc/apache2/ssl/www.theparentingplace.com.crt
SSLCertificateKeyFile /etc/apache2/ssl/server.key
    SSLCertificateChainFile /etc/apache2/ssl/www.theparentingplace.com.ca.crt

BrowserMatch ".*MSIE.*" \
    nokeepalive ssl-unclean-shutdown \
    downgrade-1.0 force-response-1.0

   RewriteEngine On
   RewriteCond %{QUERY_STRING} ^.*=(ht)|(f)+(tp)+(://|s://)+.*(\?\?)+
   RewriteRule .* http://gggooooooglleee.com/ [R,L]

   <FilesMatch "images/\.(asp|php|php5|pl)$">
       Deny from all
   </FilesMatch>
</VirtualHost>

我忘了添加

<IfModule mpm_itk_module>
    AssignUserId www-theparentingplace www-theparentingplace
</IfModule>

阻止访问安全站点部分,因此https站点无法读取会话文件。

感谢Brian North让我了解是否可以强制使用session_id for https(我无法使用错误的配置)

答案 2 :(得分:0)

session_start()必须在之前调用输出任何内容 - 所以在if ($_GET['is'] == 'set')块中,print调用会阻止您的会话启动。如果没有这个,$_SESSION['test']永远不会持续足够长的时间让if ($_SESSION['test'] == 'abc')块测试为真。 编辑:所有标头必须在任何输出之前发送(这也是之前必须调用session_start()的原因) - 因此ini_set块中的print次调用仍在阻止你的header( 'location' ... )电话。如果您需要查看ini_set()返回的内容,请将每个配置的值error_log( "Old 'suhosin.session.encrypt': " . print_r( ini_set('suhosin.session.encrypt', 0), true) );输出到错误日志中。或者在发送任何可能的标头之后缓存结果并print他们

在http和https之间转移也会丢失会话变量,因为它们会启动单独的会话。这个问题应该涵盖你的其他问题。 Session lost when switching from HTTP to HTTPS in PHP

对于suhosin... ini设置,ini_set将返回之前的值 - 因此,如果ini配置之前为false,您将获得{{} 1}},即使通话成功。