2012-05-12 5 views
2

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

しかし、私は学生を信頼できるとは思えません;)サーバー上でファイルへのアクセスやその他の悪いことを試みる可能性があります。

私は最小限のアクセスを制限するために何ができますか?
何が検討する必要がありますか?

  • ファイルアクセス
  • 最大:

    が出回っは考えました。実行時間

  • 反射

は、現在、私が想像できるコードをチェックする唯一の方法は、「ファイル」などのキーワードのためにそれを検索したネットワーキングのものをやって他とプログラム

  • 、「ネット」を開始、 "プロセス"、...正規表現を使用しています。

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

  • +2

    ダブルチェックするだけで、サンドボックスを破壊する生徒にA +を渡す予定ですか?非常に困惑しているあなたは彼らのための割り当てをしないだろう。 Anyhoo、私は喜んで彼らの履歴書を取るでしょう。 –

    +0

    彼らのほとんどは初心者ですが、彼らがより良くなったとき...生徒がサンドボックスを壊してテキストファイルを情報に残すことができれば、サーバー上でそれを分解して、すべてがうまくいき、A +を取得します。それらがサーバーをクラッシュさせたくありません。 – raisyn

    答えて

    1

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

    +0

    これは解決策ですが、オーバーヘッドが多く、仮想マシンの内外でファイルを取得したり、何か問題が発生した場合に再起動するのが難しい場合があります。 – raisyn

    0

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

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

    1

    あなたはRoslynのCTPを使用して喜んでいる場合は、Compilifyを見てみましょうことがあります。インフラストラクチャを拡張する必要はありません。重要な部分はサンドボックスを作成することです。

    0

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

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

    更新

    MSBuildのは、projのファイル内のタスクを経由して任意のコードを実行できるよう実際には、コンパイルは問題を引き起こす可能性があります。私はコンパイラ(csc.exe)を実行すると問題が生じるとは思わないが、コマンドラインを自分でビルドする必要があります。