如何防止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
++源代码,并且因为我想知道这怎么可能。因此,永远不要过分相信$_SESSION
阵列在共享虚拟主机上是安全的,并且您不能在SQL查询中安全地使用此值。
来自C函数的PHP中的一些代码(文件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>
更新[Panique]:
我只是将完整的解决方案添加到此答案中,因为这可能也会对其他人有所帮助。完整的虚拟主机设置示例:
<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>
主要内容:Apache虚拟主机类型,3. 虚拟主机配置示例Apache Web服务器可以在SAME服务器上托管多个网站。每个网站不需要单独的服务器机器和apache软件。这可以使用虚拟主机或VHost的概念来实现。 要在Web服务器上托管的任何域(网站应用)都将在apache配置文件中具有单独的条目。 Apache虚拟主机类型 Apache虚拟主机类型有两种 - 基于名称的虚拟主机 基于地址或基于IP的虚拟主机。 1. 基于名称的虚拟主机 基于名称的虚拟
我正在尝试在Windows10上的MAMP/Apache环境中配置simpleSAMLphp,下面是我的httpd vhosts。配置文件: 这是我的/etc/hosts文件: Apache通过MAMP启动,完全可以不包括这个httpd-vhosts.conf文件在我的httpd.conf文件中,但是一旦包含,Apache就不会启动,所以问题似乎是httpd-vhosts.conf.没有显示错误在
问题内容: 是否有使用节点,表达和redis / predis共享PHPSESSID的最新指南(或示例代码)? 我发现有1-2年的一些教程,它们都使用旧版本的Express或不使用Express。 Express cookie解析器也已弃用。 https://simplapi.wordpress.com/2012/04/13/php-and-node-js-session-share- redi/
本文向大家介绍关于PHP虚拟主机概念及如何选择稳定的PHP虚拟主机,包括了关于PHP虚拟主机概念及如何选择稳定的PHP虚拟主机的使用技巧和注意事项,需要的朋友参考一下 PHP型虚拟主机这种类型的虚拟主机在国外已经发展了很长时间,技术比较成熟,一般控制面板功能很丰富,管理方面也都比较完备。现在很多中小型企业在建设网站时都会选择PHP虚拟主机来托管自己的网站。之所以选择php虚拟主机,除了它开源和免费
术语"虚拟主机"是指在一个机器上运行多个网站(比如:www.company1.com和www.company2.com)。如果每个网站拥有不同的IP地址,则虚拟主机可以是"基于IP"的;如果只有一个IP地址,也可以是"基于主机名"的,其实现对最终用户是透明的。 Apache是率先支持基于IP的虚拟主机的服务器之一。1.1及其更新版本同时支持基于IP和基于主机名的虚拟主机,今后,不同的虚拟主机有时会
使用 ERB 模板配置虚拟主机是一种常见的应用, 因为每个虚拟主机配置的实例通常都使用类似的样板代码,只有一两个变量的值不同而已。 显然,对于某些网站或应用程序来说,你需要在虚拟主机的定义中指定特殊的配置选项, 然而这些特殊选项又不能通过一个简单的模板来配置 — 但是,不管怎样, 使用一个模板配置一些简单的站点将会节省时间、避免重复劳动。 操作步骤 添加如下代码到 /etc/puppet/modu