2011-10-26 19 views
3

簡單和人爲的例子:你如何保護你的SQL服務器訪問的C#應用​​程序

C#桌面應用程序談判到SQL Server數據庫。所有訂單都存在於訂單表中。

應用程序視圖,創建和修改訂單。在這個例子中,用戶只能修改自己的訂單

問題:

如果使用專用的SQL憑據存儲連接字符串。 即使使用用戶憑證,也可以通過直接通過Excel或Access進行連接來繞過應用程序安全性。

解決方案:

僅通過Web服務/中間件提供對SQL的訪問。好,但在這種情況下不一定可行。

加密應用程序中的連接字符串。不安全,通過默默無聞的安全。

通過授予對特定存儲過程,視圖等的訪問權限並且無法訪問實際表格來保護數據庫。 SP和視圖考慮用戶的權利/憑證。非常糟糕。好簡單的例子(選擇其中的用戶,變得複雜,一旦你介紹的用戶在不同的組,管理關係等

替代方案:

你會如何處理這一

感謝

+0

請記住將您的數據輸入sanatize:http://xkcd.com/327/ –

回答

5

即使使用用戶憑據,應用程序的安全性可能是 通過直接通過Excel或Access進行繞過繞過

你是什麼意思?您不應允許用戶直接連接到SQL Server或使用Excel或Access連接到SQL Server。他們不應該知道sa或其他密碼。

在此之後,當然你可以加密你的應用程序的一些部分,配置,以便沒有人可以看到它的內容。

我真的有邏輯,用戶只能在應用程序級別修改他/她自己的訂單。我猜也可以在存儲過程中完成,但這取決於應該瞭解更多細節,以提出最佳或最合適的方法。

+0

我同意,但如果他們得到證書的持有者,或者如果他們被設置爲具有NT憑據授予的訪問權限,他們可以獲得訪問權。 – Ian

+0

我認爲這是對我最有意義的道路。應用程序使用SQL身份驗證(web.config中的連接字符串),並且只有通過某些DAL才能訪問該DAL,該DAL會根據用戶標識過濾結果。那裏有一些不必要的漏洞嗎? – nycdan

+0

嗨nycdan,是的,如果用戶訪問未加密的連接字符串,他們可以連接到數據庫並執行該帳戶有權執行的任何操作。如果連接是通過集成安全的,他們只需要服務器名稱。它不會是web.config,因爲它不是一個web應用程序,所以配置文件存在於本地機器上。如果我們不使用集成的話,加密將對此有所幫助。 – Ian

3

使用Windows身份驗證代替sql身份驗證。

要允許用戶僅查看他們的數據,您可以使用SYSTEM_USER來獲取當前用戶的數據並拒絕表格本身的選擇權限,從而基於當前登錄的用戶創建視圖和篩選數據。

+2

是的,我想提出的建議,但我認爲他的問題是,在這種情況下,用戶可以連接到Access或其他工具,並修改與他自己無關的訂單。如果我當然得到了這個問題...... –

+0

這就是達維德。如果我們授予他們NT權限,他們理論上可以在Excel或Access中打開一個連接,並讀取(也可能寫入)他們希望的任何舊數據。 – Ian

+0

@Ian:查看更新的答案。 – Giorgi

1

您不能在SQL Server中執行行級安全性(以及you can,但這不是直截了當的)。所以你唯一的選擇是完全安全的是通過一個控制訪問的數據層。正如你所說,你可以存儲加密的憑證,但這並不完全安全。這取決於你需要什麼。

+0

只是尋找其他人如何接近這一點。通常我會選擇服務層,但在這種情況下,它是一個直接從桌面訪問數據庫的單一應用程序。 – Ian

1

那麼在我們的應用程序中,我們處理我們存儲的連接字符串在文件中加密。 因此,用戶無法直接訪問此文件。 我們也只使用sql連接到我們的數據庫,並授予用戶這一點。

如果您使用Windows憑據訪問它並希望防止任何操作,則可以禁止對錶進行寫入訪問。 爲了讀取數據,您可以構建查詢或訪問表。

對於寫入/添加/操作數據,您可以創建存儲過程。其中一個參數是用戶名。在構建業務邏輯的過程中,模擬具有寫入權限的用戶以最終寫入/更新數據。 你有你的「層」在SQL服務器內。 但我不會建議這樣去:)這是可能的,但很多商業邏輯內數據庫imho。所以最安全的方法是用您的語言找到一個好的加密類,只使用sql auth並將這些數據存儲在您的代碼中。

+0

謝謝,這真的很感激。我完全同意,我討厭在sql server本身擁有那個「層」,90年代感覺這麼晚了:) – Ian

相關問題