2012-01-25 10 views
7

私が書いたdll関数を他のアプリケーションが使用することを制限したい。アプリケーションの外部でDLL関数を使用することを防ぐ方法を教えてください。

例: もし2つの機能を持っているhavd database.dll。いくつかの他のアプリケーションがdatabase.dllを参照してClearDatabase()を呼び出した場合、私のアプリケーションは、この時点まで、()InsertInToDatabseと呼ばれており、他のいくつかの仕事をしている場合は

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

さて、databseはどのようにすることができますCLER out.Soだろう私はこれらの関数への呼び出しを第三者アプリケーションから制限しますか?

+1

[認証されていない発信者からのセキュアな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 [内部void ClearDatabase()]、GazTheDestroyer、Davide Piras ...それらのすべてがあなたに最高の提案をします。さらに、私はあなたに、良い.net obfuscatorを使用することを提案することができます... –

答えて

1

人々はあなたの関数を呼び出すのを止めることはできませんが、そのような状況を防ぐために関数を実装することは自由です。

たとえば、前回の呼び出しが終了するまで呼び出しがブロックされるように、またはエラーコードまたは例外とともにClear()呼び出しがすぐに戻るようなフラグを持つように、データベースへのアクセスをロックすることができます。

EDIT:私はこの質問を誤解しているかもしれません。あなたがサードパーティのコードをあなたの関数を呼び出すことを決して望んでいないなら、Marcusが示唆するようにinternal(および/またはInternalsVisibleTo)を使用してください。

1

正しく覚えていれば、internalというキーワードは、まさにこのような状況に適しています。

編集:としてclass Aassembly Bである場合、その後、class C in assembly DAへのアクセス権を持っていないので、コメントで述べています。

また、他の回答で指摘されているように、ClearDatabase()には何らかの形式の認証があります(おそらくそうあります)。

編集2:それはちょうど権限のこれらの並べ替えは、(それらの権限を持つ)は、次のユーザーならばということを意味し、データベース・レベルでなければならないことを私に夜が明けた:

A: Insert, Update, Create 

Drop Tableしようとしましたアプリケーションは例外をスローします(またはエラーを処理します)。明らかに、そうすることを妨げるでしょう。

これは、あなたがinternalとしてClearDatabase()を設定するべきではありませんが、ユーザが(サードパーティが使用している)、その後、S /彼はかかわらずにできるようになるDrop Tableへのアクセス権を持っている場合ということではありません。

編集3:

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

– Huusom 
+0

いいえ、internal、他のアセンブリから呼び出されるメソッドを防止し、彼が言及したdllとexeのような2つのアセンブリアプリケーションを持っている場合、exeはクラスライブラリの内部メソッドを呼び出すことができません。 –

+1

さて、ILMergeがあります。しかし、あなたは正しいです、私はおそらく私の答えを編集する必要があります! –

2

DLLがクラスライブラリであれば、実際のコンフィギュレーション・ファイルは、クライアントアプリケーション(web.configファイルまたはapp.exe.config)の一つ、そこにのみになります許可されたアプリケーションは、username、password、db server、およびdb nameとの適切な接続文字列を持ちます。

あなたが探している方法で不正なアプリケーションがあなたに呼び出されることがなくても、それらの悪いアプリケーションが接続文字列を知ってデータベースに直接アクセスできるようになっても、それらは混乱することがあります。

これは、設定があなたのDLLの外にある限り、許可されたアプリケーションだけが適切なデータベースにアクセスするため、心配する必要はありません。

このアプローチがまだあなたを満足させないなら、CASのようなセキュリティチェックを使用して、特定のメソッドを呼び出すことができるクラスやアセンブリを指定できるようにする必要があります。仕事。詳細については、この記事をチェックし、全体のセキュリティ層が変更された.NET 4に(あなたが質問でそれをタグ付けされた)ことに注意してくださいと古い.NET Frameworkのバージョンとは異なる動作します:http://msdn.microsoft.com/en-us/library/dd233103.aspx

0

あなたは内部アクセスを使用することができます保護する方法(公開されているのではなく)で、あなたのプロジェクトをFriend Assemblyとしてマークします。これはユニットテストプロジェクトが内部のメソッドにアクセスするのと同じ方法です。

ここMSDN's Friend Assemblies articleからの説明は友人が友達(Visual Basicの)または内部(C#の)タイプとメンバーにアクセスできるように明示的に指定のみアセンブリが...

です。たとえば、アセンブリBがアセンブリAのフレンドであり、アセンブリCがアセンブリBを参照する場合、CはAのフレンド(Visual Basic)または内部(C#)タイプにアクセスできません。

1

マーカスキーワードinternalを使用してください。そして、強力なアセンブリ名を使用している場合は、InternalsVisibleToAttributeをアプリケーションアセンブリのアセンブリ名と公開鍵でクラスライブラリに適用します。

MSDN link

0

あなたは、セキュリティについて尋ねている場合: 別の技術は、パスワードや例えば暗号化された接続文字列として、パラメータでクライアントのパスを作ることであろう。

あなたはキャッシュすることによって制限について尋ねている場合(例えばのみ、この方法は、一回毎分呼び出すことができます。) - その後、アプリケーションコードのためのサービスやCache.Insertのためにどちらかの[AspNetCacheProfile]見えます。

+0

あなたのタイトルとタグ、そのセキュリティ上の質問から、あなたの質問は、2つのアプリケーションがdllを使用していると推測するように見えるので、追加情報を追加しました。 – Paul

関連する問題