SQLite DB文件可以是只读的吗?

时间:2016-02-04 18:24:33

标签: perl sqlite file-permissions readonly

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

由于Web服务器具有自己的用户标识,因此它使用“其他”权限访问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

2 个答案:

答案 0 :(得分:2)

您必须以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

答案 1 :(得分:1)

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

事实证明,使用只读SQLite DB不能将AutoCommit设置为0。在只读数据库案例中将其显式强制为1可以解决问题。

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