【问题标题】:Can SQLite DB files be made read-only?可以将 SQLite DB 文件设为只读吗?
【发布时间】:2016-05-14 12:28:36
【问题描述】:

来自 SQLite DB 的信息通过 Web 服务器(显示在 HTML 浏览器中)呈现给用户。数据库由独立于 Web 服务器的小型应用程序一次性加载。无法从用户浏览器更改数据库数据(这是一项只读服务)。

由于网络服务器有自己的用户 ID,它以“其他”权限访问 SQLite DB 文件。出于安全考虑,我想将数据库文件权限设置为rw-rw-r--

不幸的是,使用此权限集,我收到警告 attempt to write a readonly database at line xxx,它指向关于 SELECT 事务的行(原则上是只读的)。当然,我没有得到任何结果。

如果权限更改为rw-rw-rw,一切正常,但这意味着每个人都可以篡改数据库。

SQLite DB 不能以只读方式访问有什么原因吗?

是否存在需要写入访问权限的“幕后”处理,即使对于 SELECT 事务也是如此?

在 StackOverflow 上的查找表明人们通常抱怨相反的情况:遇到只读访问权限阻止写入数据库。我的目标是保护我的数据库免受任何更改尝试。

对于完整的故事,我的网络应用程序是用Perl 编写的,并使用DBD::SQLite

【问题讨论】:

  • 在我看来,DBD::SQLite 的some versions 允许您指定standard SQLite URI parameters。其中之一是mode=ro
  • 你在使用 WAL 模式吗?
  • @CL DB 以默认模式打开;只有在默认情况下才启用 WAL 模式
  • 我可以将我的 SQLite 数据库设为只读,并且仍然可以访问它并使用 DBD::SQLite 执行 SELECT 语句,因此这似乎是特定于平台或版本的。
  • @Bacon Bits:我转换为URI参数但它不起作用

标签: perl sqlite file-permissions readonly


【解决方案1】:

您必须以readonly 模式连接到您的 SQLite 数据库。

来自the docs

您还可以在连接到数据库时(仅)设置 sqlite_open_flags:

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

【讨论】:

  • 这没有回答问题。
  • 我相信确实如此。这个想法是,如果您以这种方式连接到该文件,则可以将其设为只读。
  • 如果那是真的。
  • @Asaph:sqlite_open_flags 与 URI 参数一样没有成功
【解决方案2】:

答案在Perl DBI treats setting SQLite DB cache_size as a write operation when subclassing DBI这个问题的答案中给出。

事实证明,AutoCommit 不能使用只读 SQLite DB 设置为 0。在只读数据库的情况下将其显式强制为 1 解决了这个问题。

感谢所有提供线索和线索的人。

【讨论】:

  • 我会考虑适当地接受您自己的答案。它可能不会影响您的代表,但它会将答案标记为“这对我有帮助”,我认为这对未来的读者来说是有用的信息。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-02
  • 2012-08-16
  • 1970-01-01
  • 2013-11-28
  • 2023-03-05
  • 2010-09-14
相关资源
最近更新 更多