Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/278.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
保护PHP共享主机上的数据库和会话数据_Php_Security_Apache_Session_Shared Hosting - Fatal编程技术网

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

保护PHP共享主机上的数据库和会话数据,php,security,apache,session,shared-hosting,Php,Security,Apache,Session,Shared Hosting,我使用SQLite和存储在文件系统上的会话编写了一个PHP web应用程序 这在功能上很好,而且维护成本很低。但是,现在它需要在共享主机上运行 共享主机上的所有web应用程序都作为同一用户运行,因此我的用户的会话数据以及数据库、代码等都易受攻击 在这种情况下,许多人建议将会话存储在DBMS中,例如MySQL。所以一开始我想我会这样做,然后将SQLite数据也移动到MySQL中。但是后来我意识到MySQL凭证需要被web应用程序用户读取,所以我回到了起点 我认为最好的解决方案是使用PHP作为CGI

我使用
SQLite
和存储在
文件系统上的会话编写了一个PHP web应用程序

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

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

在这种情况下,许多人建议将会话存储在
DBMS
中,例如
MySQL
。所以一开始我想我会这样做,然后将
SQLite
数据也移动到
MySQL
中。但是后来我意识到
MySQL
凭证需要被web应用程序用户读取,所以我回到了起点

我认为最好的解决方案是使用
PHP
作为
CGI
,这样它就可以作为每个web应用程序的不同用户运行。这听起来不错,但我的主机并没有这样做,它使用的是
mod\uphp
。从管理员的角度来看,启用此功能有什么缺点吗?(性能、向后兼容性等)?如果没有,我将要求他们启用此功能


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

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

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

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


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

我不认为安全性是全部或全部。你可以采取一些步骤。仅为web db用户提供其所需的权限。将密码存储为散列。使用openid登录,以便用户通过SSL提供凭据

cgi上的PHP速度可能较慢,一些主机可能不想支持多个环境


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

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

“您可以将DB连接变量放在web根目录下的文件中。这至少可以保护它不被网络访问。如果还要使用基于文件的会话,可以在用户目录中设置会话路径,也可以在web根目录之外设置。”

我没有账户,所以我不能否决……但说真的,这与问题无关

Duh你在webroot之外存储东西。这适用于任何托管场景,并不特定于共享托管。我们这里不是说保护不受外来者的影响。我们是说保护不受同一台计算机上其他应用程序的影响

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


您可能会看到,将会话和数据库移动到MySQL,并使用安全模式和/或OpenBaseDir。

我将通过基础结构更改而不是代码更改来解决问题。 考虑升级到VPS服务器。现在你可以把它们变得非常便宜。我已经看到VPS的开始@ 10美元/亩。