2016-02-04 18 views
5

Thông tin từ một DB SQLite được trình bày cho người dùng thông qua một máy chủ web (được hiển thị trong trình duyệt HTML). DB được nạp một lần cho tất cả bởi một ứng dụng nhỏ độc lập với máy chủ web. Không thể thay đổi dữ liệu DB từ trình duyệt của người dùng (đây là dịch vụ chỉ đọc).Các tệp DB SQLite có thể được thực hiện chỉ đọc không?

Vì máy chủ web có id người dùng riêng, nó truy cập tệp DB SQLite với quyền "khác". Vì lý do bảo mật, tôi muốn đặt quyền tệp DB là rw-rw-r--.

Thật không may, với bộ quyền này, tôi nhận được cảnh báo attempt to write a readonly database at line xxx trỏ đến một dòng về giao dịch SELECT (về nguyên tắc là chỉ đọc). Tất nhiên, tôi không nhận được kết quả.

Nếu quyền được thay đổi thành rw-rw-rw, mọi thứ hoạt động tốt, nhưng điều đó có nghĩa là mọi người đều có thể giả mạo DB.

Có lý do nào khiến DB SQLite không thể truy cập chỉ đọc không?

Có các quy trình "đằng sau hậu trường" cần truy cập ghi, ngay cả đối với các giao dịch SELECT không?

Tra cứu trên StackOverflow cho thấy mọi người thường phàn nàn về tình huống ngược lại: gặp phải quyền truy cập chỉ đọc ngăn việc ghi vào DB. Mục tiêu của tôi là bảo vệ DB của tôi trước bất kỳ thay đổi nào.

Đối với những câu chuyện hoàn chỉnh, ứng dụng web của tôi được viết bằng Perl và sử dụng DBD::SQLite

+0

Dường như với tôi như [một số phiên bản] (http://search.cpan.org/~ishigaki/DBD-SQLite-1.48/lib/DBD/SQLite.pm) của DBD :: SQLite cho phép bạn chỉ định [ các tham số URI SQLite chuẩn] (http://www.sqlite.org/uri.html). Một trong số đó là 'mode = ro'. –

+0

Bạn đang sử dụng chế độ WAL? –

+0

@CL DB được mở bằng các chế độ mặc định; Chế độ WAL chỉ được bật nếu nó là mặc định – ajlittoz

Trả lời

1

Các giải pháp được đưa ra trong trả lời cho câu hỏi này Perl DBI treats setting SQLite DB cache_size as a write operation when subclassing DBI.

Nó chỉ ra rằng AutoCommit không thể được đặt thành 0 với DB chỉ đọc SQLite. Rõ ràng buộc nó đến 1 trong trường hợp DB chỉ đọc đã giải quyết được vấn đề.

Nhờ tất cả những người đã đưa ra manh mối và khách hàng tiềm năng.

+0

Tôi sẽ xem xét chấp nhận câu trả lời của riêng bạn phù hợp. Nó có thể không ảnh hưởng đến đại diện của bạn, nhưng nó nhãn câu trả lời là "điều này đã giúp tôi", mà tôi nghĩ là một thông tin hữu ích cho độc giả trong tương lai. – Yunnosch

2

Bạn phải kết nối với db SQLite của bạn trong chế độ readonly.

Từ the docs:

Bạn cũng có thể thiết lập sqlite_open_flags (chỉ) khi bạn kết nối với một cơ sở dữ liệu:

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

Điều này không trả lời được câu hỏi. – reinierpost

+0

Tôi tin là vậy. Ý tưởng là các tập tin có thể được thực hiện chỉ đọc nếu bạn kết nối với nó theo cách này. – Asaph

+0

Nếu điều đó đúng. – reinierpost

Các vấn đề liên quan