2012-01-25 19 views
7

我想限制其他應用程序使用我寫的dll函數。如何確保在我的應用程序之外使用dll函數?

例如, 如果我有包含兩個函數的database.dll。

public void InsertInToDatabse(); 
public void ClearDatabase(); 

現在,如果我的應用程序已調用InsertInToDatabse(),並做一些其他的工作,直到這個時候,如果其他一些應用程序通過引用database.dll調用ClearDatabase(),該DATABSE將CLER out.So怎麼能我限制從第三方應用程序調用這些函數?

+1

可能出現[Secure C#程序集未經授權的調用者]的副本(http://stackoverflow.com/questions/2806842/secure-c-sharp-assemblies-from-unauthorized-callers)。 [這個答案](http://stackoverflow.com/a/2807142/69809)有一些很好的見解。 – Groo

+1

問題不在於如何保護您的代碼,問題在於如何保護您的數據庫。 – Huusom

+0

Marcus Hansson [內部無效ClearDatabase()],GazTheDestroyer,Davide Piras ...所有人都給了你最好的建議。另外;我可以建議你,使用一個好的.net混淆器... –

回答

1

你不能阻止人們調用你的函數,但你可以自由地實現你的函數來防止這種情況。例如,您可以鎖定數據庫訪問,以便在前一個調用完成之前阻止調用,或者您可以使用導致Clear()調用立即返回錯誤代碼或異常的標誌。

編輯:我可能誤解了這個問題。如果你永遠不需要第三方代碼來調用你的函數,那麼就像Marcus所說的那樣使用內部(和/或InternalsVisibleTo)。

1

如果我沒有記錯,internal關鍵字就是針對這些類型的情況。

編輯:正如評論所說,如果class Aassembly B,然後class C in assembly D不會有A訪問。

另外,正如其他答案中指出的那樣,您可以(也可能應該)在ClearDatabase()中擁有某種形式的身份驗證。

編輯2:這只是我恍然大悟,這些類型的權限應該在數據庫級,這意味着如果以下的用戶(那些特權):

A: Insert, Update, Create 

試圖Drop Table ,那麼應用程序會拋出一個異常(或者你處理錯誤),這顯然會阻止他們這樣做。

這並不是說你不應該設置ClearDatabase()internal,但如果用戶(第三方正在使用)有權限Drop Table那麼他/她可以不管。

編輯3:

The problem is not how to secure your code, the problem is how to secure your database. 

– Huusom 
+0

不,內部阻止從其他程序集調用該方法,並且如果他有兩個程序集應用程序(如他提到的dll和一個exe),則exe不能調用類庫的內部方法。 –

+1

那麼,有ILMerge。但你是對的,我應該編輯我的答案! –

2

如果您的DLL是一個類庫的實際配置文件將客戶端應用程序的一個(或web.config中app.exe.config),並在那裏只授權的應用程序將具有正確的連接字符串,包括用戶名,密碼,數據庫服務器和數據庫名

現在,即使未經授權的應用程序也會被阻止以您正在查找的方式調用您的dll的方法,但如果這些不好的應用程序通過了解連接字符串而直接訪問數據庫,它們仍然可能會陷入混亂。

這會說,事實上,只要配置在你的dll外面,你不應該擔心,因爲只有授權的應用程序纔會訪問正確的數據庫。

如果這種方法仍然不能滿足你,那麼你應該使用像CAS這樣的安全檢查,它允許你指定哪個類或程序集可以調用某個方法,所以即使你的dll被其他應用程序所引用,工作。要注意的是在.NET 4中(你的問題標記吧)整個安全層已經改變,從舊版本的.NET Framework的工作方式不同,檢查這篇文章的詳細信息:http://msdn.microsoft.com/en-us/library/dd233103.aspx

0

你可以使用內部訪問在你想保護的方法上(而不是公開的),然後將你的項目標記爲朋友組裝。這與您允許單元測試項目訪問內部方法的方式相同。

下面是從MSDN's Friend Assemblies article說明...

明確指定的朋友可以訪問好友(Visual Basic)或內部(C#)類型和成員只有組件。例如,如果程序集B是集A和裝配C引用了程序集B的朋友,C不具有A.

1

訪問朋友(Visual Basic)或內部(C#)類型馬庫斯提到你可以使用internal關鍵字。然後,如果您使用強大的程序集名稱,則將InternalsVisibleToAttribute應用於您的類庫,並帶有應用程序程序集的程序集名稱和公鑰。

MSDN link

0

如果你問有關安全: 另一種方法是使客戶端傳遞的參數,如密碼或例如加密的連接字符串。

如果您問的是緩存限制(例如,只允許每分鐘調用一次此方法),請查看服務的[AspNetCacheProfile]或應用程序代碼的Cache.Insert。

+0

從您的標題和標籤,它的一個安全問題,但我添加額外的信息,因爲你的問題似乎推斷兩個應用程序正在使用DLL。 – Paul

相關問題