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

时间:2020-03-06 14:41:59  来源:igfitidea点击:

我使用" SQLite"编写了一个PHP网络应用程序,并将会话存储在"文件系统"中。

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

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

在这种情况下,许多建议将会话存储在" MySQL"之类的" DBMS"中。因此,起初我以为我会这样做,并将SQLite数据也移到MySQL中。但是后来我意识到Web应用程序用户必须能够读取MySQL凭据,因此我回到了第一点。

我认为最好的解决方案是将PHP用作CGI,以便每个Web应用程序以不同的用户身份运行。听起来不错,但我的主持人不这样做,它使用的是mod_php。从管理员的角度来看,启用此功能是否有任何弊端? (性能,向后兼容性等)?如果没有,那么我将要求他们启用此功能。

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

解决方案

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

如果托管服务提供商允许,以PHP的身份作为CGI在其他用户下运行将有所帮助,但我希望会对性能产生重大影响,因为每个请求都需要创建一个新流程。 (我们可以将FCGI视为性能更好的替代方案。)

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

在这种情况下,我们需要考虑共享托管降低的安全性,决定是否可以接受低成本共享托管的权衡。这将取决于应用程序,并且可能与其尝试提​​出一种复杂的(甚至可能不是非常有效的)方法来增加安全性,否则最好是接受风险。

我不将安全视为全部或者一无所获。我们可以采取一些步骤。仅授予Web数据库用户所需的权限。将密码存储为哈希。使用openid登录,以便用户通过SSL提供其凭据。

cgi上的PHP可能较慢,并且某些主机可能根本不希望支持多个环境。

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

如果我们意识到共享服务器所在站点的数据的隐私和安全性,则共享主机将无法运行网站。Web应用程序可访问的任何内容对于其他应用程序都是公平的。他们访问它只是时间问题(假设他们确实有动力对我们这样做)。

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

我没有帐户,所以我不能对此投票。.但是,说真的,这甚至与问题无关。

you,我们将东西存储在webroot之外。这适用于任何托管方案,并不特定于共享托管。我们这里不是在谈论免受外来者的侵害。我们正在谈论保护免受同一台计算机上的其他应用程序的侵害。

对于OP,我认为PHP作为CGI是最安全的解决方案,正如我们已经建议过的那样。但是正如其他人所说的那样,这会对性能产生影响。

我们可能会看到的是将会话和数据库移至MySQL并使用safe_mode和/或者open_basedir。

我将通过基础结构更改而不是代码一来解决该问题。
考虑升级到VPS服务器。如今,我们可以以非常便宜的价格获得它们。我已经看到VPS的起价为10 $ / mo。