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

7
我使用SQLitefilesystem存储会话编写了一个PHP Web应用程序。这在功能上是很好的,而且维护成本也很低。但是,现在它需要在共享主机上运行。
共享主机上的所有Web应用程序都以相同的用户身份运行,因此我的用户会话数据以及数据库、代码等都很容易受到攻击。
许多人建议在这种情况下将会话存储在诸如MySQL之类的DBMS中。所以我一开始想只是这样做,将SQLite数据移动到MySQL中。但是,我意识到MySQL凭据需要被Web应用程序用户读取,所以我回到了原点。
我认为最好的解决方案是将PHP作为CGI使用,以便它作为每个Web应用程序的不同用户运行。这听起来很好,但我的主机不支持它,它使用mod_php。从管理员的角度来看,启用此功能是否有任何缺点(性能、向后兼容性等)?如果没有,那么我将要求他们启用此功能。
否则,在这种情况下,我能做些什么来保护我的数据库和会话数据吗?
5个回答

4
只要您的代码作为共享Web用户运行,服务器上存储的任何内容都将容易受到攻击。任何其他用户都可以编写PHP脚本来检查服务器上的任何可读文件,包括您的数据和PHP代码。
如果您的托管提供商允许,使用不同用户下的PHP作为CGI运行将有所帮助,但我预计会有显着的性能损失,因为每个请求都需要创建一个新进程。(您可以考虑FCGI作为更好的替代方案。)
另一种方法是基于用户提供的信息设置cookie,并使用它来加密会话数据。例如,当用户登录时,对其用户名、密码(刚刚由他们提供)和当前时间进行哈希处理,使用哈希加密会话数据,设置包含哈希的cookie。在下一个请求中,您将收到cookie,然后可以使用它来解密会话数据。但请注意,这只能保护当前会话数据;您的用户表、其他数据和代码仍然容易受到攻击。
在这种情况下,您需要决定是否接受共享托管的低成本与提供的降低安全性之间的权衡。这将取决于您的应用程序,也许您最好接受风险,而不是试图想出一种复杂(可能甚至不太有效)的方法来增加安全性。

1

我不认为安全性是非黑即白的。你可以采取一些措施。只给Web数据库用户所需的权限。将密码存储为哈希值。使用OpenID登录,以便用户通过SSL提供其凭据。

在cgi上运行的PHP可能会更慢,有些主机可能只想支持一个环境。

您可能因某种原因需要坚持使用您的主机,但通常有很多可用的主机,这是一个良好的提醒,让人们比较功能、安全性以及成本。我注意到许多公司开始提供虚拟机托管服务——几乎与专用服务器相当的安全性,可以将您的代码与其他用户隔离开来——而且价格合理。


0
如果您关心与共享服务器上的其他网站共享数据的隐私和安全,那么共享主机绝不是运行网站的好选择。对于您的Web应用程序可访问的任何内容,其他人都可以使用;假设他们确实有动机这样做,那么他们很快就能够访问它(假设他们确实有这样的动机)。

0

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

我没有账号,所以无法对此进行负面评价...但是,这与问题甚至不相关。

当然,你需要将东西存储在网站根目录之外。这适用于任何托管方案,而不仅仅是共享托管。我们谈论的不是保护免受外部攻击,而是保护免受同一台机器上其他应用程序的攻击。

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

你可以考虑将会话和数据库移动到MySQL中,并使用safe_mode和/或open_basedir。


0
我会通过基础设施的改变来解决问题而不是通过代码。 考虑升级到VPS服务器,现在你可以非常便宜地获得它们。我已经看到VPS从每月10美元起售。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接