在我的网站数据库中使用SQLite时的实用性和安全性


Practicality and security when using SQLite for my website database?

我正在为我工作的公司构建一个网站,前端已经完成。目前,该网站通过从JSON文件中读取的信息来填充自己。

我很快就会离开这份工作,我想离开这个网站,这样其他员工就可以更新它,而不需要知道如何正确读取和写入JSON数据。因此,我正在编写一个非常简单的网站来进行更新(列出当前在活动网站上的项目,允许用户添加项目、删除项目或重新排序项目。)数据都是文本,在调用服务器进行编写之前,我正在JS中进行一些基本的清理。更重要的是,我使用.htaccess来要求员工登录,甚至访问网站的这一部分。

所以现在我需要一个真正的数据库来写。由于我们的网站是由OSX服务器运行的,我们已经安装了SQLite3。从我在StackOverflow上读到的内容来看,只要我不需要UN/PW访问,或者不需要扩展到100k以上的点击量,SQLite作为一个实时数据库就可以很好地工作。(我们是一家小公司,每天会有2-3支安打)。

我开始设置一个PHP页面来连接到数据库并对其进行写入,在一次无声的失败后,我意识到.DB文件需要对组进行RW访问才能让网站访问它。这意味着数据库和保存它的目录(我认为)至少需要444,如果不是777的话。我问负责服务器管理的老板关于设置这个问题,他说他不愿意这样做。虽然我理解他的担忧,但我不确定我还能做什么。如果没有RW对文件的访问权限,我不知道有什么其他方法可以做到这一点。

那么我有什么选择呢?我应该放弃SQLite而只安装MySQL吗?如果我坚持使用SQLite,那么安全性的最佳实践是什么?是否有一些公认的最佳方法来设置数据库/加密数据/隐藏数据库?

谢谢!

您可能会混淆UNIX/Linux文件权限web可访问性

在*NIX中,每个文件都属于一个所有者和一个组。机器上的每个进程,包括终端上的用户,都在属于一个或多个组的用户下运行这就是文件权限的意义所在。它们控制哪个进程可以访问哪些文件。用户可能具有文件的直接权限(用户权限)、通过其组成员身份获得的间接权限,或者,如果没有其他权限,则具有其他权限。

这一切都与网络用户无关。web服务器是一个侦听端口80(或其他位置)上传入HTTP请求的进程。然后它决定如何响应这些请求。在任何情况下,这种do-I-respond-or-don't-I都与文件权限无关。web服务器有自己的规则,哪些请求允许,哪些请求拒绝。这些规则与文件权限无关。

如果web服务器试图访问磁盘上的某些文件,文件权限将发挥作用。web服务器作为属于某个组(通常为www-data)的某个用户运行。这意味着网络服务器可以读取、写入或执行它有权限的文件。如果网络服务器没有文件的读取权限,它将无法为其提供服务。但仅仅因为网络服务器有文件的写入权限并不意味着网站访问者可以以任何方式写入该文件,因为网络服务器不允许他们这样做。网络服务器提供网络请求,它不向随机用户提供直接的文件访问。

典型的设置是web服务器作为www-data运行。传入的请求会导致web服务器启动一个PHP脚本,该脚本也作为具有www-data权限的子进程运行。PHP进程读取或写入文件;它只能读取和写入具有www-data权限的文件,可以控制脚本的读取或写入内容。

如果您想使用SQLite数据库,则必须有对该文件的权限。确实,您通常希望尽可能多地分离权限。但在这种情况下,您需要授予www-data用户(或运行PHP的任何用户)访问该文件的权限。那又怎样?这本身并不是一个安全漏洞。最糟糕的情况是,获得www-data权限的攻击者将能够写入数据库。但在此之前,他必须绕过许多其他安全机制,所以这应该是你最不担心的。