安全的只读sqlite3数据库

7
我希望给我的网站用户任意只读访问SQLite3数据库的权限,而不允许他们写入数据库或造成任何其他损害。如何做到?
将db文件设置为只读有一定帮助,但是像"ATTACH"、".load"和".output"这样的命令允许人们读/写其他未受保护的文件。
当然,如果我知道所有这样的命令,我会过滤它们,但我最担心的是我没有想到的命令。
我尝试简要修改sqlite3的源代码以禁止写入,但这比看起来更难:即使SELECT语句似乎也进行了一些内部的INSERTS等操作。
注意:我考虑了DOS攻击,并将cputime限制在5秒左右。我主要关心的是文件损坏/黑客行为,而不是DOS攻击。
chroot()可能有效,但似乎太极端了。
你有什么想法吗?
编辑:哇,我真的在三年前问过这个问题?

从那时起,我实际上写了一个程序来做这件事。

我认为这是相当安全的(但我可能错了)。

这里有一个样本查询。


我猜我真的在寻找一种“元解决方案”。例如,如果我将整个系统运行在只读光盘上,那么就不需要担心sqlite3可以/不能做什么。在我这种情况下,这太极端了,但总体想法是我想找到一个不依赖于sqlite3属性的解决方案。 - user354134
4个回答

1

您没有提及如何访问SQLite数据库。

如果您是通过C API(例如编写一个C语言的CGI,接收原始SQL查询,将其传递给sqlite,然后返回任何返回值)进行访问,则".load"等点命令无需考虑。这些由sqlite3 shell程序实现,在直接调用C API函数时不起作用。

在这种情况下,您可以调用sqlite3_open_v2,将SQLITE_OPEN_READONLY作为标志之一传递,以防止对数据库进行写操作。

可以通过调用sqlite3_limit()将SQLITE_LIMIT_ATTACHED设置为1来禁用ATTACH命令,以防止附加第二个数据库成功。由于DETACH语句“取消附加以前使用ATTACH语句附加的其他数据库连接”,因此似乎会防止从绕过此限制而分离原始数据库。

据我查看SQLite理解的SQL,这应该可以关闭所有漏洞。你可能希望仔细检查指示器,以确保没有遗漏,如果有任何遗漏,请告诉我,我会更新此答案。

1
当然,如果我知道所有这样的命令,我会过滤掉它们,但我最担心的是我没有想到的命令。
您是否考虑使用白名单而不是黑名单?只允许以SELECT或EXPLAIN开头的语句。

是的,但不必允许它。使用准备语句代替sqlite3_exec,每次只执行一个语句。 - dan04
1
用户编写查询与准备语句完全相反。 - rook
1
我认为一个请求完成多个查询对我来说已经足够了,但我仍然担心嵌套查询。然而,如果文件是只读的,那可能没关系。我会检查SQLite3是否响应“SELECT * FROM(ATTACH ...)”类型的查询。我还担心有些分号会让sqlite运行多个查询。当然,我可以过滤掉分号,但你懂的。 - user354134

0

确保您的用户具有写入访问权限,并且其他用户(特别是Web服务器运行的用户)仅对文件本身具有读取访问权限。当然,如何做这取决于您的平台(Linux、Windows等)。


没错,那部分很容易。难的是:哪些sqlite3命令可以访问其他文件(例如ATTACH)。 - user354134

0

在操作系统中将数据库文件设置为只读。一旦完成,SQLite 就无法覆盖它。如果仍然存在问题,则不是 SQLite 的问题。他们可能仍然能够找到 php/cgi 等问题,但这就是安全性的本质。


很遗憾,这并不是真的(那是我的原始计划)。像ATTACH这样的命令可以访问其他文件。 - user354134
如果您的环境不允许访问其他文件,他们就无法做太多事情。您能在chroot监狱中运行它吗? - Jay

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接