0

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

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

我创建了以下测试脚本(未设置 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.simulation=On 完全关闭 suhosin 我在 php.ini 中都试过了

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

在另一台专用服务器上,测试脚本工作正常,即。https url 获取会话变量,但是此服务器是 Ubuntu 10.04。

知道下一步该怎么做吗?

4

3 回答 3

1

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

于 2013-10-26T06:33:53.313 回答
1

I broke this myself recently when I merged the HTTP and HTTPS VirtualHost file into one and changed the apache server to MPM-ITK for security reasons.

In the merged VirtualHost file

<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>

I had forgotten to add the

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

block to the secure site section, hence the https site was not able to read the session files.

Thanks to Brian North who got me onto the idea of checking if I can force the session_id for https (I was not able to with the wrong configuration)

于 2013-10-27T18:53:55.377 回答
0

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

在 http 和 https 之间传输也会丢失会话变量,因为它们会启动单独的会话。这个问题应该涵盖您的其余问题。在 PHP 中从 HTTP 切换到 HTTPS 时会话丢失

对于您的suhosin...ini 设置,ini_set将返回以前的值 - 因此,如果 ini 配置以前是,即使调用成功false,您也会得到。false

于 2013-10-26T06:34:18.877 回答