2010-09-17 40 views
6

Tôi muốn cấp cho người dùng trang web quyền truy cập chỉ đọc vào cơ sở dữ liệu SQLite3 mà không cho phép họ ghi vào cơ sở dữ liệu hoặc làm bất kỳ thiệt hại nào khác. Làm sao?Cơ sở dữ liệu sqlite3 chỉ đọc an toàn

Làm cho tệp db chỉ đọc giúp một chút, nhưng các lệnh như "ATTACH", ".load" và ".output" cho phép mọi người đọc/ghi các tệp khác, có thể không được bảo vệ.

Tất nhiên, nếu tôi biết tất cả các lệnh như vậy, tôi chỉ lọc chúng, nhưng tôi hầu như lo lắng về các lệnh mà tôi chưa từng nghĩ tới.

Tôi đã thử một thời gian ngắn để thay đổi mã nguồn của sqlite3 để không cho phép viết, nhưng điều này khó hơn: ngay cả câu lệnh SELECT cũng xuất hiện để làm một số INSERTS nội bộ/etc.

Lưu ý:Tôi đã xem xét các cuộc tấn công của DOS và sẽ mất đến 5 giây hoặc điều gì đó. Mối quan tâm chính của tôi là thiệt hại cho các tập tin/"hack", không phải DOS.

chroot() có thể hoạt động, nhưng có vẻ cực đoan.

Suy nghĩ?

EDIT: Chà, tôi có thực sự hỏi từ 3 năm trước không?

Kể từ đó, I've actually written a program to do this.

mà tôi nghĩ là an toàn hợp lý (nhưng tôi có thể là sai).

Here is a sample query.

+0

Tôi đoán tôi thực sự đang tìm kiếm một "giải pháp meta" ở đây. Ví dụ, nếu tôi chạy toàn bộ hệ thống của tôi ra khỏi một đĩa CD chỉ đọc, tôi sẽ không phải lo lắng về những gì sqlite3 có thể/không thể làm. Đó là quá khắc nghiệt trong trường hợp của tôi, nhưng ý tưởng chung là tôi muốn tìm một giải pháp hoạt động w/o tùy thuộc vào các thuộc tính sqlite3. – barrycarter

Trả lời

1

Tất nhiên, nếu tôi biết tất cả lệnh như vậy, tôi chỉ muốn lọc chống họ, nhưng tôi chủ yếu là lo lắng về lệnh Tôi đã không nghĩ đến.

Bạn đã cân nhắc sử dụng danh sách cho phép thay vì danh sách cấm? Chỉ cho phép các câu lệnh bắt đầu bằng SELECT hoặc EXPLAIN.

+1

sqllite cho phép truy vấn xếp chồng ... – rook

+0

Có, nhưng * bạn * không phải cho phép. Thay vì sqlite3_exec, sử dụng các câu lệnh đã chuẩn bị, chỉ thực hiện một câu lệnh tại một thời điểm. – dan04

+1

Truy vấn bằng văn bản của người dùng đối diện chính xác với các câu lệnh đã chuẩn bị. – rook

0

Đảm bảo rằng người dùng của bạn có quyền truy cập ghi và những người dùng khác (đặc biệt là người dùng mà máy chủ web chạy) chỉ đọc quyền truy cập vào chính tệp đó. Cách bạn thực hiện điều này tùy thuộc vào nền tảng của bạn (Linux, Windows, v.v.)

+0

Phải. Phần đó dễ dàng. Phần khó khăn: lệnh sqlite3 có thể truy cập các tệp khác (ví dụ, ATTACH). – barrycarter

0

Làm cho tệp cơ sở dữ liệu của bạn chỉ đọc trong hệ điều hành. Khi bạn đã thực hiện xong, SQLite không thể ghi đè lên nó. Nếu bạn vẫn gặp sự cố thì đó không phải là vấn đề về SQLite. Họ vẫn có thể tìm thấy một vấn đề php/cgi/etc nhưng đó là bản chất của con thú an ninh.

+0

Thật không may, không đúng (đó là kế hoạch ban đầu của tôi). Các lệnh như ATTACH có thể truy cập các tệp khác. – barrycarter

+0

Nếu môi trường của bạn không cho phép truy cập vào các tệp khác thì không có nhiều thứ mà chúng có thể làm với nó. Bạn có thể chạy nó trong một nhà tù chroot? – Jay

0

Bạn chưa đề cập đến cách bạn đang cung cấp quyền truy cập vào cơ sở dữ liệu SQLite.

Nếu bạn làm như vậy thông qua API C (ví dụ: viết CGI trong C có truy vấn SQL thô, chuyển nó tới sqlite và sau đó trả về bất kỳ thứ gì được trả về), thì các lệnh dấu chấm như ".load" không quan tâm. Chúng được thực hiện bởi sqlite3 shell program và sẽ không hoạt động khi gọi trực tiếp các chức năng C API.

Trong trường hợp này, bạn có thể gọi sqlite3_open_v2 chuyển SQLITE_OPEN_READONLY làm một trong các cờ để ngăn không cho cơ sở dữ liệu được ghi.

Lệnh ATTACH có thể bị vô hiệu hóa bằng cách gọi sqlite3_limit() để đặt SQLITE_LIMIT_ATTACHED thành 1 để ngăn không cho đính kèm cơ sở dữ liệu thứ hai từ thành công. Kể từ khi tuyên bố DETACH "làm gián đoạn kết nối cơ sở dữ liệu bổ sung được đính kèm trước đây bằng cách sử dụng câu lệnh ATTACH" có vẻ như điều này sẽ ngăn không cho người dùng tách cơ sở dữ liệu gốc để bỏ qua hạn chế này.

Theo như tôi có thể biết từ khi nhìn vào SQL understood by SQLite, điều này sẽ đóng tất cả các lỗ. Bạn có thể chạy qua pragmas bằng lược răng để đảm bảo rằng nếu có bất kỳ điều gì tôi bỏ lỡ, hãy cho tôi biết và tôi sẽ cập nhật câu trả lời này.

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