2016-02-04 788 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

相關問題