2016-02-04 21 views
5

Informationen aus einer SQLite-DB werden dem Benutzer über einen Webserver angezeigt (in einem HTML-Browser angezeigt). Die Datenbank wird einmalig von einer kleinen, vom Webserver unabhängigen Anwendung geladen. DB-Daten können nicht vom Benutzerbrowser geändert werden (dies ist ein schreibgeschützter Dienst).Können SQLite-DB-Dateien schreibgeschützt gemacht werden?

Da der Webserver über eine eigene Benutzer-ID verfügt, greift er auf die SQLite DB-Datei mit "anderen" Berechtigungen zu. Aus Sicherheitsgründen möchte ich die DB-Dateiberechtigungen als rw-rw-r-- festlegen.

Leider, mit diesem Berechtigungssatz, bekomme ich eine Warnung attempt to write a readonly database at line xxx, die auf eine Zeile über eine SELECT Transaktion zeigt (die im Prinzip schreibgeschützt ist). Natürlich bekomme ich kein Ergebnis.

Wenn Berechtigungen auf rw-rw-rw geändert werden, funktioniert alles gut, aber das bedeutet, dass jeder die DB manipulieren kann.

Gibt es einen Grund, warum auf die SQLite DB nicht schreibgeschützt zugegriffen werden kann?

Gibt es "hinter den Kulissen" Verarbeitungen, die Schreibzugriff benötigen, auch für SELECT-Transaktionen?

Nachschlagen in StackOverflow zeigt, dass sich Benutzer normalerweise für die gegenteilige Situation beschweren: eine schreibgeschützte Zugriffsberechtigung, die das Schreiben in die DB verhindert. Mein Ziel ist es, meine Datenbank vor jedem Änderungsversuch zu schützen.

Für die komplette Geschichte, meine Web-App in Perl geschrieben und verwendet DBD::SQLite

+0

Es sieht für mich wie [einige Versionen] (http://search.cpan.org/~ishigaki/DBD-SQLite-1.48/lib/DBD/SQLite.pm) von DBD :: SQLite können Sie angeben, [ Standard-SQLite-URI-Parameter] (http://www.sqlite.org/uri.html). Einer davon ist 'mode = ro'. –

+0

Verwenden Sie den WAL-Modus? –

+0

@CL DB wird mit Standardmodi geöffnet; WAL-Modus ist nur aktiviert, wenn es Standard ist – ajlittoz

Antwort

1

Die Lösung in der gegeben ist Beantworten Sie diese Frage Perl DBI treats setting SQLite DB cache_size as a write operation when subclassing DBI.

Es stellt sich heraus, dass AutoCommit nicht mit schreibgeschütztem SQLite DB auf 0 gesetzt werden kann. Durch explizites Erzwingen von 1 im Nur-Lese-DB-Fall wurde das Problem gelöst.

Danke an alle, die Hinweise und Hinweise gegeben haben.

+0

Ich würde in Betracht ziehen, Ihre eigene Antwort angemessen zu akzeptieren. Es hat wahrscheinlich keinen Einfluss auf Ihre Rep, aber es bezeichnet die Antwort als "das hat mir geholfen", was ich für die zukünftigen Leser als nützliche Information empfinde. – Yunnosch

2

Sie auf Ihre SQLite db in readonly Modus verbinden müssen.

Von the docs:

Sie können auch festlegen sqlite_open_flags (nur), wenn Sie mit einer Datenbank verbinden:

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

Dies beantwortet die Frage nicht. – reinierpost

+0

Ich glaube es tut. Die Idee ist, dass die Datei schreibgeschützt gemacht werden kann, wenn Sie auf diese Weise eine Verbindung herstellen. – Asaph

+0

Es tut, wenn das wahr ist. – reinierpost

Verwandte Themen