4

サーバーがコンパイルして実行し、結果を返す C コードをユーザーが入力できるようにする Web ベースのサービスを構築したいと考えています。私は知っています、私は知っています、セキュリティの悪夢。なので、chroot や lxc などを使うことができるかもしれません。それらについては、stackoverflow に良い投稿があります。別のオプションは、プログラミング コンテスト ソフトウェアを使用することです。

私がやっていることは、一般的なプログラミングの目的ではありません。ユーザーは、いくつかのスタブ関数にコードを追加できます。それだけです。ポインター、配列、または文字列を使用できる必要はありません。ファイル、ソケット、または共有メモリを開いたり、閉じたり、読み書きしたりできないようにする必要があります。独自の関数を作成することさえできません。次のことのみを実行できる必要があります。

// style comments
/* */ style comments
declare variables of type int, double, float, int64_t, int32_t, uint64_t, uint32_t
for, while, do
+, -, *, /, % arithmetic operators ( * as dereference is NOT allowed )
( )
+, - unary operators
++, -- operators
math functions like sin, cos, abs, fabs, etc
a bunch of API functions that will exist
switch, case, break
{ }
if, else, ==, !=
=, +=, -=, *=, /=, etc

Cコードの特定のチャンクをチェックして、それらの要素のみが含まれていることを確認するために使用できるツールはありますか?

既存のソリューションが見つからない場合は、Antlr などを使用して自分で考え出すことができます。

4

1 に答える 1

1

ユーザー コードを実行する Web サービスの実例については、Travis CI継続的インテグレーション サービスをご覧ください。オープンソース プロジェクトは、これを使用して単体テストを一元的に実行します。Travis のプロセスは次のようになります。

  • 正常な構成から新しいVM を起動します。
  • ユーザー コードをロードしてコンパイルします。
  • テストを実行して結果を表示します。
  • VM を破棄します。

人々がシステム上でボットネットを実行するのを防ぐための時間制限 (10 分間の IIRC) がありますが、それ以外は、VM は完全に機能し、インターネットに接続されています。制限された構文やその他の人為的な制限は必要ありません。

ユーザーをどれだけ制限しても、サーバーをユーザー コードの脅威から安全に保つことは決してできないということを覚えておく必要があります。もう 1 つの方法は、サーバーがユーザー コードに触れた瞬間にサーバーが完全に破壊されたと想定し、それを破棄することです。これは Travis が行っていることです。VM ソフトウェアには通常、この種の作業を支援するスナップショット機能があります。

于 2013-04-24T18:07:32.113 に答える