我使用SQLite
和存储在filesystem
上的 session 编写了一个PHP Web应用程序。
这在功能上很好,而且维护成本低。但是,现在它需要在共享主机上运行。
共享主机上的所有Web应用程序都以同一用户身份运行,因此我的用户的 session 数据以及数据库,代码等都容易受到攻击。
在这种情况下,许多建议将 session 存储在DBMS
中,例如MySQL
。因此,起初我以为我会这样做,并将SQLite
数据也移到MySQL
中。但是后来我意识到MySQL
凭据需要Web应用程序用户可以读取,因此我回到第一篇。
我认为最好的解决方案是将PHP
用作CGI
,以便每个Web应用程序以不同的用户身份运行。听起来不错,但是我的主持人不这样做,它使用mod_php
。从管理员的角度来看,启用此功能是否有任何弊端? (性能,向后兼容性等)?如果没有,我将要求他们启用此功能。
否则,在这种情况下我能做些什么来保护我的数据库和 session 数据?
最佳答案
只要您的代码以共享的Web用户身份运行,服务器上存储的所有内容都将很容易受到攻击。任何其他用户都可以编写PHP脚本来检查服务器上任何可读的文件,包括您的数据和PHP代码。
如果您的托管服务提供商允许,以PHP身份作为CGI在其他用户下运行将有所帮助,但我希望会对性能产生重大影响,因为每个请求都需要创建一个新流程。 (您可以将FCGI视为性能更好的替代方案。)
另一种方法是根据用户提供的内容设置cookie,并使用该cookie加密 session 数据。例如,当用户登录时,对用户名,密码(由他们提供)和当前时间进行哈希处理,使用哈希对 session 数据进行加密,并设置包含哈希的cookie。在下一个请求时,您将获得该cookie,然后可将其用于解密 session 数据。但是请注意,这只会保护当前的 session 数据。您的用户表,其他数据和代码仍然容易受到攻击。
在这种情况下,您需要考虑共享托管降低的安全性,决定是否可以接受低成本共享托管的权衡。这将取决于您的应用程序,可能是与其尝试提出一种复杂的(甚至可能不是非常有效的)方法来增加安全性,否则最好是接受风险。