2010-09-17 49 views
6

我想給我的網站用戶任意只讀訪問一個 SQLite3數據庫,而不讓他們寫入數據庫或做任何 其他損害。怎麼樣?安全的只讀sqlite3數據庫

使db文件只讀有一點幫助,但像「ATTACH」,「.load」和「.output」這樣的命令允許用戶讀/寫其他 文件,這些文件可能不受保護。

當然,如果我知道所有這些命令,我​​只是過濾它們, ,但我最擔心的是我沒有想到的命令。

我想簡要地改變sqlite3的源代碼,以禁止寫,但 這是比看起來難:即使SELECT語句用來做 一些內部INSERTS /等。

注:我認爲DOS攻擊,並會ULIMIT CPUTIME爲5秒或 東西。我主要關心的是對文件/「黑客」的破壞,而不是DOS。

chroot()可能工作,但似乎極端。

想法?

編輯:哇,我真的問這3年多前?

此後,I've actually written a program to do this.

我認爲這是相當安全的(但我可能是錯的)。

Here is a sample query.

+0

我想我真的在這裏尋找一個「元解決方案」。例如,如果我將整個系統從只讀CD上運行,我就不必擔心sqlite3可以/不可以做什麼。這在我的情況下太過於極端,但總的想法是我想找到一個解決方案,無論工作取決於sqlite3屬性。 – barrycarter 2010-09-17 21:40:55

回答

1

當然,如果我知道所有的這些 命令,我只是對過濾他們 ,但我主要是擔心我沒有想到的 命令。

您是否考慮過使用白名單而不是黑名單?只允許以SELECT或EXPLAIN開頭的語句。

+1

sqllite允許查詢堆疊... – rook 2010-09-17 19:37:38

+0

是的,但*您*不必允許。而不是sqlite3_exec,使用預處理語句,一次只能執行一條語句。 – dan04 2010-09-17 19:43:00

+1

用戶編寫查詢與預準備語句完全相反。 – rook 2010-09-17 21:01:45

0

確保您的用戶具有寫入訪問權限,並且其他用戶(特別是運行Web服務器的用戶)只能讀取文件本身。你如何做到這一點當然取決於你的平臺(Linux,Windows等)

+0

對。這部分很簡單。難點在於:sqlite3命令可以訪問其他文件(例如,ATTACH)。 – barrycarter 2010-09-28 22:39:06

0

使你的數據庫文件只能在操作系統中讀取。一旦你完成了SQLite無法覆蓋它。如果你仍然有問題,這不是一個SQLite問題。他們仍然可以找到一個php/cgi/etc的問題,但這是安全野獸的本質。

+0

不幸的是,這不是真的(那是我原來的計劃)。像ATTACH這樣的命令可以訪問其他文件。 – barrycarter 2010-09-28 22:39:32

+0

如果你的環境不允許訪問其他文件,那麼他們可以用它做很多事情。你可以在chroot監獄裏運行嗎? – Jay 2010-09-29 16:35:04

0

你還沒有提到你如何提供對SQLite數據庫的訪問。

如果您是通過C API(例如,在C中編寫一個需要原始SQL查詢的CGI,將其傳遞給sqlite,然後返回返回的任何內容),那麼諸如「.load」之類的點命令是無關緊要。這些由sqlite3 shell program實現,並且在直接調用C API函數時不起作用。

在這種情況下,您可以調用sqlite3_open_v2作爲標誌之一傳遞SQLITE_OPEN_READONLY以防止寫入數據庫。

可以通過調用sqlite3_limit()將SQLITE_LIMIT_ATTACHED設置爲1以禁止附加第二個數據庫來禁用ATTACH命令。由於DETACH語句「分離了先前使用ATTACH語句附加的其他數據庫連接」,聽起來像這樣會阻止人們爲了繞過此限制而分離原始數據庫。

據我所知,從SQL understood by SQLite可以看出,這應該關閉所有的洞。您可能希望通過細齒梳來穿過pragmas,以確保如果有任何我想念的東西讓我知道,我會更新這個答案。