2016-02-04 17 views
5

Informacje z SQLite DB są prezentowane użytkownikowi za pośrednictwem serwera WWW (wyświetlane w przeglądarce HTML). DB jest ładowana raz dla wszystkich przez małą aplikację niezależną od serwera WWW. Dane DB nie mogą zostać zmienione z przeglądarki użytkownika (jest to usługa tylko do odczytu).Czy pliki DB SQLite mogą być tylko do odczytu?

Ponieważ serwer internetowy ma własny identyfikator użytkownika, uzyskuje dostęp do pliku SQLite DB z "innymi" uprawnieniami. Ze względów bezpieczeństwa chciałbym ustawić uprawnienia pliku DB jako rw-rw-r--.

Niestety, dzięki temu zestawowi uprawnień otrzymuję ostrzeżenie attempt to write a readonly database at line xxx, które wskazuje na linię o transakcji SELECT (która w zasadzie jest tylko do odczytu). Oczywiście nie otrzymuję rezultatu.

Jeśli uprawnienia zostaną zmienione na rw-rw-rw, wszystko działa poprawnie, ale to oznacza, że ​​każdy może manipulować przy DB.

Czy istnieje powód, dla którego SQLite DB nie można uzyskać dostępu tylko do odczytu?

Czy istnieją procesy "za kulisami", które wymagają dostępu do zapisu, nawet w przypadku transakcji SELECT?

Wyszukiwanie w StackOverflow pokazuje, że ludzie zwykle skarżą się na sytuację odwrotną: napotykają uprawnienia dostępu tylko do odczytu, uniemożliwiające pisanie do DB. Moim celem jest ochrona mojego DB przeciwko JAKIEJKOLWIEK próbie zmiany.

Dla kompletnej historii, moja aplikacja internetowa jest napisane w Perl i wykorzystuje DBD::SQLite

+0

Wygląda na to, że [niektóre wersje] (http://search.cpan.org/~ishigaki/DBD-SQLite-1.48/lib/DBD/SQLite.pm) w DBD :: SQLite umożliwiają określenie [ standardowe parametry URI SQLite] (http://www.sqlite.org/uri.html). Jednym z nich jest 'mode = ro'. –

+0

Czy używasz trybu WAL? –

+0

@CL DB jest otwarty z domyślnymi trybami; Tryb WAL jest włączony tylko wtedy, gdy jest ustawiony domyślnie – ajlittoz

Odpowiedz

1

Rozwiązanie jest podane w odpowiedź na to pytanie Perl DBI treats setting SQLite DB cache_size as a write operation when subclassing DBI.

Okazuje się, że AutoCommit nie można ustawić na 0 z SQLite tylko do odczytu. Jawnie wymuszenie go na 1 w przypadku DB tylko do odczytu rozwiązało problem.

Dziękuję wszystkim, którzy dali wskazówki i prowadzi.

+0

Uważam, że zaakceptowanie własnej odpowiedzi jest właściwe. Prawdopodobnie nie wpływa to na twój przedstawiciel, ale oznacza odpowiedź jako "to mi pomogło", co uważam za przydatną informację dla przyszłych czytelników. – Yunnosch

2

należy podłączyć do SQLite db w trybie readonly.

Od the docs:

Można również ustawić sqlite_open_flags (tylko) podczas łączenia się z bazą danych:

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

To nie odpowiada na pytanie. – reinierpost

+0

Uważam, że tak. Chodzi o to, że plik może zostać utworzony tylko do odczytu, jeśli połączysz się z nim w ten sposób. – Asaph

+0

Dzieje się tak, jeśli to prawda. – reinierpost

Powiązane problemy