2016-02-04 791 views
5

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

由于Web服务器有自己的用户标识,因此它使用“其他”权限访问SQLite DB文件。出于安全原因,我想将DB文件权限设置为rw-rw-r--

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

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

是否有任何理由为什么SQLite数据库不能被访问只读?

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

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

对于完整的故事,我的web应用程序是用Perl和使用DBD::SQLite

+0

在我看来,像[某些版本](http://search.cpan.org/~ishigaki/DBD-SQLite-1.48/lib/DBD/SQLite.pm)的DBD :: SQLite允许您指定[标准SQLite URI参数](http://www.sqlite.org/uri.html)。其中之一是'mode = ro'。 –

+0

你在使用WAL模式吗? –

+0

@CL DB以默认模式打开; WAL模式仅在默认情况下启用 – ajlittoz

回答

1

解决方法就是在给定的回答这个问题Perl DBI treats setting SQLite DB cache_size as a write operation when subclassing DBI

事实证明AutoCommit不能设置为0与只读SQLite数据库。在只读数据库情况下明确强制为1解决了问题。

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

+0

sqlite_open_flags没有成功我会考虑接受你自己的答案适当。这可能不会影响你的代表,但它将答案标记为“这对我有帮助”,我认为这对未来的读者来说是一个有用的信息。 – Yunnosch

2

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

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

+0

这不回答这个问题。 – reinierpost

+0

我相信它。这个想法是,如果以这种方式连接它,文件可以只读。 – Asaph

+0

它确实如此。 – reinierpost

相关问题