保护PHP共享主机上的数据库和会话数据

时间:2008-09-25 01:35:41

标签: php security apache session shared-hosting

我使用SQLite编写了一个PHP网络应用程序,并在filesystem上编写了会话。

这在功能上很好,而且维护费用很低。但是,现在它需要在共享主机上运行。

共享主机上的所有Web应用程序都以同一用户身份运行,因此我的用户的会话数据容易受到攻击,数据库,代码等也是如此。

许多人建议在DBMS中存储会话,例如MySQL。所以起初我以为我会这样做,并将SQLite数据也移到MySQL。但后来我意识到,MySQL凭证需要Web应用程序用户可读,所以我回到原点。

我认为最好的解决方案是使用PHP作为CGI,因此它作为每个Web应用程序的不同用户运行。这听起来不错,但我的主持人没有这样做,它使用mod_php。启用此功能,管理员的观点是否存在任何缺陷? (性能,向后兼容性等)?如果没有,那么我会要求他们启用此功能。

否则,在这种情况下,我能做些什么来保护我的数据库和会话数据?

5 个答案:

答案 0 :(得分:4)

只要您的代码作为共享Web用户运行,存储在服务器上的任何内容都将容易受到攻击。任何其他用户都可以编写PHP脚本来检查服务器上的任何可读文件,包括您的数据和PHP代码。

如果你的托管服务提供商允许它,在不同用户下以PHP作为CGI运行会有所帮助,但我预计会有很大的性能损失,因为每个请求都需要创建一个新进程。 (您可以将FCGI视为表现更佳的替代方案。)

另一种方法是根据用户提供的内容设置cookie,并使用它来加密会话数据。例如,当用户登录时,获取其用户名,密码(仅由他们提供)和当前时间的哈希,使用哈希加密会话数据,设置包含哈希的cookie。在下一个请求中,您将获得cookie,然后您可以使用它来解密会话数据。但请注意,这只会保护当前的会话数据;您的用户表,其他数据和代码仍然容易受到攻击。

在这种情况下,考虑到它提供的安全性降低,您需要决定是否可以接受共享主机的低成本权衡。这将取决于您的应用程序,而不是试图提出一种复杂的(可能甚至不是非常有效的)增加安全性的方法,您最好只是接受风险。

答案 1 :(得分:1)

我不认为安全是全有或全无的。您可以采取一些步骤。仅为Web db用户提供所需的权限。将密码存储为哈希值。使用openid登录,以便用户通过SSL提供凭据。

cgi上的PHP可能会变慢,而某些主机可能根本不想支持多个环境。

由于某些原因,您可能需要坚持使用主机,但通常有很多可用的功能,以便人们比较功能和安全性以及成本。我注意到许多公司开始提供虚拟机托管 - 在将代码与其他用户隔离方面几乎是专用的服务器级安全性 - 这对我来说是合理的成本。

答案 2 :(得分:0)

如果您从共享服务器的站点了解数据的隐私性和安全性,则共享主机无法运行网站。您的Web应用程序可访问的任何内容都是其他人的公平游戏;他们可以访问它只是时间问题(假设他们有动力去做那件事)。

答案 3 :(得分:0)

“您可以将数据库连接变量放在Web根目录下的文件中。这至少可以保护它免受Web访问。如果您还要使用基于文件的会话,您可以在您的网站中设置会话路径用户的目录,并再次在Web根目录之外。“

我没有帐户,所以我无法拒绝这一点......但严重的是,这与问题无关。

你把东西存放在webroot之外。这适用于任何托管方案,并非特定于共享托管。我们不是在谈论在这里保护外人。我们谈论的是在同一台机器上保护其他应用程序。

对于OP,我认为PHP作为CGI是最安全的解决方案,正如您已经建议的那样。但是,正如其他人所说,这会带来性能上的打击。

您可能会看到的是将会话和数据库移动到MySQL并使用safe_mode和/或open_basedir。

答案 4 :(得分:0)

我会通过基础架构更改而不是代码更改来解决问题。 考虑升级到VPS服务器。现在你可以让它们非常便宜。我见过VPS从@ 10 $ / mo开始。