我有一个https服务器,它使用json来保存登录信息(注册用户和哈希密码),但我担心有人可能会闯入机器并窃取这个json文件。我考虑了以下解决方案,但我认为它们中的任何一个都不能解决问题:
- 如果我将其设置为不可读,我将不得不以 root 身份执行网站,这意味着如果有人设法闯入,他们将已经拥有 root 访问权限;
- 如果我创建另一个用户,该用户也必须能够阅读它,因此如果有人设法闯入,他们将已经是该用户并且能够访问它。
那么,有没有一个最佳的解决方案呢?
我有一个https服务器,它使用json来保存登录信息(注册用户和哈希密码),但我担心有人可能会闯入机器并窃取这个json文件。我考虑了以下解决方案,但我认为它们中的任何一个都不能解决问题:
那么,有没有一个最佳的解决方案呢?
您的问题是,通过您的网站侵入服务器的人将始终拥有与网站本身相同的访问权限。“特定的可执行文件”在这里没有帮助,因为针对网站的最常见攻击涉及欺骗正确的可执行文件做错误的事情,例如让您的 webapp include() 成为 HTML 输出中的秘密文件。
避免这种情况的唯一方法是使网站不需要完整的用户名和密码列表。将帐户存储代码拆分为作为不同 UID 运行的单独应用程序,这样您的 Web 应用程序只能向“帐户管理”应用程序询问给定的用户名和密码是否有效。(这可以通过 localhost、JSON-RPC 或 gRPC 或现在流行的“微服务”使用普通的 HTTP 请求。)
这个术语是特权分离。
(“平面文件”与“数据库”在安全性方面没有任何区别。数据库 - 甚至是基于文件的数据库,如 SQLite - 仅比平面文件具有更好的搜索和更新功能,例如它不会得到如果系统在更新过程中崩溃会损坏...但这对数据安全没有任何影响,因为可以将明文密码存储在任何类型的文件中,加密的密码可以存储在任何类型的文件中,并且可以将密码哈希也存储在任何类型的文件中。
话虽如此...如果您的 web 应用程序对文件执行任何类型的更新,那么请切换到 SQLite 而不是 JSON。将上述拆分为两个服务后,所有与帐户相关的代码都将放在一个地方,所以这应该相当容易。)