如何防止 PHP 会话在不同的 apache 虚拟主机之间共享?

2023-11-24

如何防止 PHP 会话在不同的 Apache 虚拟主机之间共享?

我在 Apache 2.2 上设置了不同的虚拟主机,一切都运行良好,直到我意识到 PHP 会话默认是共享的。


编辑也是您始终应该设置 session_save_path (http://php.net/manual/en/function.session-save-path.php)或使用数据库会话处理(http://php.net/manual/en/class.sessionhandler.php)如果您使用的是共享虚拟主机。有人可以在该站点上创建一个会话 ID,并将其 chmod 为 777,然后在您的站点上使用该会话 ID 来绕过登录/或获取更多权限。它还可以用于 SQL 注入。

这是可行的,因为 PHP 不强制哪些会话 ID 属于哪个站点。我知道这一点是因为我分析了 PHP 会话背后的 C/C++ 源代码,并且因为我想知道这是如何实现的。所以永远不要过分相信$_SESSIONarray 在共享 Web 托管上是安全的,并且您无法在 SQL 查询中安全地使用此值。

PHP 中来自 C 函数的一些代码(文件 session.c)php_session_start();是的,当您调用时会调用此函数session_start()来自 PHP(我看到的唯一检查是在这些代码行中):

/* Check whether the current request was referred to by
 * an external site which invalidates the previously found id. */

if (PS(id) &&
        PS(extern_referer_chk)[0] != '\0' &&
        PG(http_globals)[TRACK_VARS_SERVER] &&
        zend_hash_find(Z_ARRVAL_P(PG(http_globals)[TRACK_VARS_SERVER]), "HTTP_REFERER", sizeof("HTTP_REFERER"), (void **) &data) == SUCCESS &&
        Z_TYPE_PP(data) == IS_STRING &&
        Z_STRLEN_PP(data) != 0 &&
        strstr(Z_STRVAL_PP(data), PS(extern_referer_chk)) == NULL
) {
    efree(PS(id));
    PS(id) = NULL;
    PS(send_cookie) = 1;
    if (PS(use_trans_sid) && !PS(use_only_cookies)) {
        PS(apply_trans_sid) = 1;
    }
}

唯一的检查是 HTTP 标头“HTTP_REFERER”,但我们都知道它可以伪造,所以这就是“通过模糊实现安全”。唯一安全的方法是使用session_save_path或使用数据库会话处理程序。

要在 php.ini 中设置 session_save_path,您应该在此处找到更多信息http://php.net/manual/en/session.configuration.php.

或者,如果 PHP 作为 Apache 模块运行,您可以在 vhost 容器的 htaccess 文件中配置它:

php_value session.save_path "path"

或者甚至更好的是每个虚拟主机有一个 PHPINIDir:

<VirtualHost ip>
[...]
PHPINIDir /var/www/...
[...]
</VirtualHost>

更新[帕尼克]:

我只是将完整的解决方案添加到这个答案中,因为这也可能对其他人有帮助。完整虚拟主机设置示例:

<VirtualHost *:81>
    DocumentRoot /var/www/xxx1
    <Directory "/var/www/xxx1">
        AllowOverride All
        php_value session.save_path "/var/mysessionforproject_1"
   </Directory>
</VirtualHost>

<VirtualHost *:82>
    DocumentRoot /var/www/xxx2
    <Directory "/var/www/xxx2">
        AllowOverride All
        php_value session.save_path "/var/mysessionforproject_2"
   </Directory>
</VirtualHost>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何防止 PHP 会话在不同的 apache 虚拟主机之间共享? 的相关文章

随机推荐