SQLite数据库文件是否可以设置为只读?

8
通过Web服务器(在HTML浏览器中显示)向用户呈现SQLite DB中的信息。DB由一个与Web服务器无关的小型应用程序一次性加载。用户浏览器无法更改DB数据(这是只读服务)。
由于Web服务器有其自己的用户ID,因此它使用“其他”权限访问SQLite DB文件。出于安全原因,我想将DB文件权限设置为rw-rw-r--
不幸的是,使用此权限设置,我收到一个警告attempt to write a readonly database at line xxx,该警告指向有关SELECT事务的行(原则上是只读的)。当然,我没有得到任何结果。
如果权限更改为rw-rw-rw,则一切正常,但这意味着每个人都可以篡改DB。 是否有任何理由SQLite DB无法进行只读访问? 是否有“幕后”处理需要写入访问权限,即使对于SELECT事务也是如此? 在StackOverflow上查找显示,人们通常抱怨相反的情况:遇到只读访问权限阻止向DB写入。我的目标是保护我的DB免受任何更改尝试。
完整的故事是,我的Web应用程序是用Perl编写的,使用DBD :: SQLite。

在我看来,DBD :: SQLite 的一些版本允许您指定标准 SQLite URI 参数。其中一个是 mode=ro - Bacon Bits
你正在使用WAL模式吗? - CL.
@CL 数据库以默认模式打开;仅当它是默认设置时,才启用WAL模式。 - ajlittoz
我可以将我的SQLite数据库设置为只读,仍然可以使用DBD::SQLite访问它并执行SELECT语句,因此这似乎是特定于平台或版本的。 - reinierpost
@Bacon Bits:我已经转换为URI参数,但它不起作用。 - ajlittoz
@reinierpost 你的数据库只读模式怎么样了?文件权限是使用还是不使用模式参数? - ajlittoz
2个回答

2

您必须以只读模式连接到SQLite数据库。

来自文档

You can also set sqlite_open_flags (only) when you connect to a database:

use DBD::SQLite;
my $dbh = DBI->connect("dbi:SQLite:$dbfile", undef, undef, {
  sqlite_open_flags => DBD::SQLite::OPEN_READONLY,
});
-- https://metacpan.org/pod/DBD::SQLite#Database-Name-Is-A-File-Name

这个链接介绍了关于DBD::SQLite的数据库名称是文件名的相关信息。

这并没有回答问题。 - reinierpost
我相信它是这样的。这个想法是,如果你以这种方式连接到文件,它可以被设置为只读。 - Asaph
如果那是真的,它就会这样做。 - reinierpost
@Asaph:使用sqlite_open_flags和URI参数都没有成功。 - ajlittoz

1

我认为接受你自己的答案是适当的。这可能不会影响你的声望,但它将标记答案为“这对我有帮助”,我认为这对未来的读者是有用的信息。 - Yunnosch

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