2012-01-18 9 views
2

私は、ユーザーがユーザーが入力したC#コードを安全にする方法は?

someFieldValue == "someValue" 

のような式を入力することができますし、我々は、その式の結果に基づいて書式を適用条件付き書式機能を、構築しています。これを実現する最も簡単な方法(完全な表現式の構文を使用)は、CSharpCodeProvider.CompileAssemblyFromSourceのように見えます。

式がユーザーによって入力されるため、これは大きなセキュリティホールです(たとえば、ユーザーが式someFieldValue == Process.Start("shutdown","/s /t 0")を入力する可能性があります)。

質問:これは生産システムのためだった場合は、私が入力された式は問題を起こさないことを保証することができますか?今は内部ツールですが、運用システムに公開する場合は、準備をしてパス(C#CodeDom)を使用して後でスクラップする必要はありません。安全ではないと考えられる

いくつかのものは:

  • は、アプリケーションを終了
  • へのアクセス/ファイル/レジストリ/システム設定などのローカルリソースを変更する呼び出し元のプロセスをクラッシュメモリ
  • 内のオブジェクトを変更
  • 起動アプリケーション
  • ...

それはあなたはないできるすべてのものを列挙するのは無理なので、私の気持ちは、溶液が、それは私たちが喜んでいるすべての機能を公開プロキシオブジェクトで動作するように、ユーザーが入力した表現を修正関与するということですその表現に暴露する。これは、式で任意の関数呼び出しを許可しないことを意味します。また、式はもはや標準のC#コードではなく、最終的にはこれに対して別の言語構文を使用する方が現実的かもしれません。

C#で使用できる利点はHUGEです。これは、式で使用できる「プラグイン」を許可するためで、既存のコードとのシームレスな統合が可能になるためです。 1つの解決策はjavascriptのようなスクリプト言語を使うことですが、まずC#を除外しなければならないことを確認したいと思います。

+0

おそらくDynamicExpressionを使用して、設定された数の演算子/式を許可することができます。または、より一般的には、式の文字列を解析して、許可ツリーのリストを持つ式ツリーにします。 –

+0

あなたは自分自身を攻撃するユーザーを記述しています*。ユーザーは自分自身を攻撃することができます。なぜこれはセキュリティホールですか? –

+1

Webサーバー。式はクライアントによって入力されますが、アクセスが制限されていないため、サーバー上で混乱を招く可能性があります。現時点では、内部使用のためのものなので、問題はありませんが、生産上は受け入れられません。しかしAppDomainは問題を解決しました。 – tenfour

答えて

2

私はあなたがこれを見ておくべきだと思います。

Assembly.CreateInstance and security

本の推奨アプローチは サンドボックスアプリケーションドメイン内の疑わしいコードを実行することです。 http://blogs.msdn.com/b/shawnfa/archive/2006/04/19/579066.aspxにはいくつかの理由があり、さらに重要なのは のほとんどが.NET 4.0から廃止されていることです。さらに重要なのは です。

+2

ありがとうございます - 私はこれを実装しました。実際、AppDomainsは私が探しているものです。興味のある人には、[この記事](http://msdn.microsoft.com/en-us/library/bb763046.aspx)を参照してください。 – tenfour

関連する問題