2

C# をエンド ユーザーが TextBox で編集し、アプリケーションの実行中にコンパイルして、既に実行中のアプリケーションから呼び出すDSL として C# を使用することは可能ですか?

私が質問するのは、今後数か月で単純な数学演算 DSL を実装する必要があるからです ( http://rachel53461.wordpress.com/2011/08/20/the-math-converterで Rachel Lim がブログで書いたようなものに似ています)。 / XAML/Converter の側面ではなく、彼女のコードの数学処理の側面に焦点を当てています)。if ステートメントやその他の機能を追加したいので、彼女のコードをそのまま再利用することには抵抗があります。C# 自体を使用できる場合は、再実装することなくすべての機能を利用できます。

これが可能である場合、そのためにどのフレームワーク、名前空間、またはクラスを使用したいですか?

C# から派生した DSL で私が行うことの 1 つは、必要なすべての using ヘッダー ステートメントをハードコードし、知識のあるユーザーが入力したすべての using ステートメントを削除することです。これの目的は、エンド ユーザーが企業ポリシーの希望に反して、またはサイト管理者の知識なしに、C# に似た DSL を本格的なコンパイラに活用しようとする可能性を減らすことです。 私が提案した using ステートメントの管理は、ユーザーのいたずらに対する十分な防御になりますか?

最後に、これまでのすべての答えが「はい」である場合、このアプローチの欠点、特にセキュリティの脆弱性をもたらす欠点は何ですか?

ポール

4

3 に答える 3

4

私が提案した using ステートメントの管理は、ユーザーのいたずらに対する十分な防御になりますか?

いいえ。完全修飾クラスへの参照も削除する必要があります。その後、ユーザーは引き続きリフレクションを使用して、どちらの方法でも参照していないクラスにアクセスできます。

別の appdomain を作成してユーザーのコードを含めると、適切にサンドボックス化できます。このプロセスを詳しく説明しているMSDN の関連記事を次に示します。

于 2012-10-18T22:40:41.970 に答える
1

using ディレクティブを削除しても、ユーザーがSystem.Diagnostics.Process.Start("evilprogram.exe"). これを (プロパティへのアクセスも妨げずに) 行うには、C# パーサーを使用する必要があります。

ただし、これにはコード アクセス セキュリティを使用できる場合があります。

于 2012-10-18T22:38:39.873 に答える
1

Stackoverflow は、リンクの回答をコメントに自動的に変換するようになりました。なんて可愛らしいです。

EXE を生成せずに動的コードをコンパイルして実行しますか?

とにかく、答えはそこにありますMicrosoft.CSharp.CSharpCodeProvider

于 2012-10-18T22:41:51.063 に答える