在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。
知道接下来要做什么吗?
答案 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}},即使通话成功。