0

CodeChef や TechGig などのオンライン ジャッジを作成する予定です。最初は、C/C++ でのみソリューションを受け付けます。

同じセキュリティモデルを考えてみましたが、今のところ私の懸念は、実行とテストの部分をどのようにモデル化するかです。

方法 1

より一般的と思われる方法は、標準入力を実行可能ファイルにリダイレクトし、標準出力をファイルにリダイレクトすることです。次に例を示します。

./submission.exe < input.txt > output.txt

次に、output.txt ファイルを一部の solution.txt ファイルと 1 文字ずつ比較し、結果を報告します。

方法 2

私が見た 2 番目のアプローチは、ユーザーが main() を記述できないようにすることです。代わりに、いくつかの引数を文字列の形式で受け取り、グローバル変数を出力として設定する関数を作成します。例えば:

//This variable should be set before returning from submissionAlgorithm()
char * output; 

void submissionAlgorithm(char * input1, char * input2)
{
    //Write your code here.
}

各ステップで、テスト ケースを実行するために、関数 submitAlgorithm() が繰り返し呼び出され、出力変数の結果がチェックされます。

最初の分析から、方法 2 は安全であるだけでなく (提出されたコードからファイルシステムへのすべての読み取りおよび書き込みアクセスを防止する)、テスト ケースの実行が高速化される (おそらく?) ことがわかりました。結果はメモリに発生します。

方法 1 が方法 2 よりも優先される理由があるかどうかを知りたいです。

PS: もちろん、オンライン ジャッジ エンジンを Linux サーバーでホストします。

4

1 に答える 1

4

これを誤解しないでください。ただし、セキュリティをはるかに高い視点から検討する必要があります。問題は、ファイルに書き込まれる入力と出力ではなく、パフォーマンスにもあまり影響しないはずです。ただし、実際にプロセス(2番目の場合)またはシステム全体(ディスクに書き込むためのOSの呼び出し、大量のメモリの取得など)を停止させる可能性のあるサブミッションを管理する必要があります。

免責事項私は決してセキュリティの専門家ではありません。

于 2012-08-09T19:11:08.470 に答える