安全的只读sqlite3数据库

时间:2010-09-17 19:24:49

标签: security sqlite

我想给我的网站用户任意只读访问权限 SQLite3数据库,不让他们写入数据库或做任何事情 其他伤害。怎么样?

使db文件只读有点帮助,但命令如 “ATTACH”,“。load”和“.output”允许人们读/写其他 文件,可能不受保护。

当然,如果我知道所有这些命令,我​​只会过滤它们, 但我最担心的是我没想过的命令。

我曾短暂地尝试改变sqlite3的源代码以禁止写入,但是 这比它看起来更难:即使SELECT语句似乎也如此 一些内部INSERTS /等。

注意: 我考虑过DOS攻击,并将cputime限制为5s或者 一些东西。我主要担心的是文件损坏/“黑客攻击”,而不是DOS。

chroot()可能会起作用,但似乎极端。

思想?

编辑:哇,3年多前我真的问过这个吗?

此后,I've actually written a program to do this.

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

Here is a sample query.

4 个答案:

答案 0 :(得分:1)

  

当然,如果我知道所有这些   命令,我只是过滤掉   他们,但我最担心的是   命令我没有想到。

您是否考虑过使用白名单而不是黑名单?只允许以SELECT或EXPLAIN开头的语句。

答案 1 :(得分:1)

您尚未提及如何提供对SQLite数据库的访问权限。

如果你是通过C API这样做的(例如在C中编写一个接受原始SQL查询的CGI,将其传递给sqlite,然后返回返回的内容),那么像“.load”这样的点命令是没关系。这些是由sqlite3 shell program实现的,在直接调用C API函数时不起作用。

在这种情况下,您可以调用sqlite3_open_v2传递SQLITE_OPEN_READONLY作为其中一个标志,以防止写入数据库。

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

据我所知,SQL understood by SQLite,这应该可以关闭所有漏洞。你可能希望用精细的梳子穿过pragmas以确保,如果有任何我想念的东西让我知道,我会更新这个答案。

答案 2 :(得分:0)

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

答案 3 :(得分:0)

使您的数据库文件只在操作系统中读取。一旦你完成了,SQLite就无法覆盖它。如果您仍有问题,那不是SQLite问题。他们可能仍然能够找到php / cgi / etc问题,但这就是安全野兽的本质。