7

我使用SQLite存储在filesystem.

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

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

DBMS许多人建议在这种MySQL情况下存储会话。所以起初我以为我会这样做,并将SQLite数据MySQL也移动到其中。但后来我意识到MySQLWeb 应用程序用户需要读取凭据,所以我又回到了原点。

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

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

4

5 回答 5

4

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

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

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

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

于 2008-09-25T01:52:30.633 回答
1

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

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

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

于 2008-09-25T01:56:10.610 回答
0

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

于 2008-09-25T01:58:13.647 回答
0

“你可以将你的数据库连接变量放在 web 根目录下的文件中。这至少可以保护它免受 web 访问。如果你也打算使用基于文件的会话,你可以在用户目录中设置会话路径和再次在网络根目录之外。”

我没有帐户,所以我不能对此投反对票。但严重的是,它甚至与问题无关。

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

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

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

于 2008-09-25T02:05:23.880 回答
0

我会通过更改基础设施而不是代码来解决问题。考虑升级到 VPS 服务器。现在你可以很便宜地买到它们。我已经看到 VPS 的起步价为 10 美元/月。

于 2008-09-25T08:17:17.993 回答