我想给我的网站用户任意只读访问权限 SQLite3数据库,不让他们写入数据库或做任何事情 其他伤害。怎么样?
使db文件只读有点帮助,但命令如 “ATTACH”,“。load”和“.output”允许人们读/写其他 文件,可能不受保护。
当然,如果我知道所有这些命令,我只会过滤它们, 但我最担心的是我没想过的命令。
我曾短暂地尝试改变sqlite3的源代码以禁止写入,但是 这比它看起来更难:即使SELECT语句似乎也如此 一些内部INSERTS /等。
注意: 我考虑过DOS攻击,并将cputime限制为5s或者 一些东西。我主要担心的是文件损坏/“黑客攻击”,而不是DOS。
chroot()可能会起作用,但似乎极端。
思想?
编辑:哇,3年多前我真的问过这个吗?
此后,I've actually written a program to do this.
我认为相当安全(但我可能是错的)。
答案 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问题,但这就是安全野兽的本质。