2

現在、自動ソース コード検証ツールを作成しています。基本的に、学生はさまざまなタスクのソリューションとして C# ソース コード ファイルをアップロードする必要があります。サーバーは、フレームワーク内でこれらのファイルをコンパイルし、さまざまな入力ファイルに対してプログラムをチェックします。プログラムが生成する出力が有効な場合 (定義済みの出力と等しい場合)、プログラムは有効であり、学生はプログラムのポイントを取得します。

しかし、私は学生を信頼できるとは思いません;) ファイルへのアクセスを取得しようとしたり、サーバー上で他の悪いことを実行しようとしたりするかもしれません.

アクセスを最小限に制限するにはどうすればよいですか?
何を考慮する必要がありますか?

すでに考えた:

  • ファイルアクセス
  • 最大 実行時間
  • 他のプログラムの開始
  • ネットワーキングのことをしている
  • 反射

現在、私が想像できるコードをチェックする唯一の方法は、正規表現を使用して「ファイル」、「ネット」、「プロセス」などのキーワードで検索することでした。

しかし、これは非常に安全ではないと確信しています。
助言がありますか?

4

4 に答える 4

1

Roslyn CTPを使用する場合は、Compilifyを参照してください。スケーリングインフラストラクチャは必要ありません。重要な部分はサンドボックスの作成です。

于 2012-05-13T03:35:32.327 に答える
1

セキュリティ面だけの場合は、サンドボックスでプログラムをコンパイルして実行する必要があります。アクセスできる場合は、仮想化されたマシンを検討してください。セキュリティ エクスプロイトのソース コードをスキャンすることは、かなりの作業のように思えます (率直に言って、学生がコードを正しく出力しながらエクスプロイトを達成できる場合は、ボーナス ポイントを考慮する必要があります :P)

于 2012-05-12T22:04:19.137 に答える
0

学生のソースのコンパイル自体がセキュリティリスクをもたらすことはありませんが、コードが信頼されていないため、学生のコードを実行するにはサンドボックスが必要です。AppDomainsはこの目的に使用でき、特定のアクセス許可(ExecutionやFileIOなど)を割り当てることができます。MSDNのこの記事を参照してください。タイムアウトした場合に中止できるように、別のスレッドでターゲットコードを実行する機能を追加することをお勧めします。

学生がプログラムをクラッシュさせることを心配している場合(たとえば、StackOverflowExceptionを引き起こす無限再帰呼び出し)、メインアプリケーションに通信できる別のホストプロセスで上記のすべてを実行する必要があります。

アップデート

実際には、msbuildがprojファイル内のタスクを介して任意のコードを実行する可能性があるため、コンパイルで問題が発生する可能性があります。コンパイラ(csc.exe)を実行しても問題はないと思いますが、コマンドラインを自分で作成する必要があります。

于 2012-05-13T03:39:55.443 に答える
0

また、非常に制限された権限を持つ新しいSystem.Diagnostics.Processユーザーとしてコンパイルを実行することもできます。これは無限ループなどから保護することはできませんが、初心者のプログラマーでも偶発的な無限ループを送信する可能性があるため、自分のプログラムでも手動で確認する必要があります。

http://www.curlybrace.com/words/2009/06/04/run-external-application-as-another-user-in-c/

于 2012-05-13T03:10:02.317 に答える