1

Djangoとは異なり、Python構文で記述された構成ファイルを実装することを考えています。

構成ファイルで実行可能コードを使用するメリットについて1つか2つのSOの質問を見てきましたが、コードの間違いがロックアップするのを防ぐために、「サンドボックス」で構成ファイルコードを実行する方法があるかどうか知りたいです。ホストアプリケーション。

ホストアプリケーションはプログラマーのツールであるため、少なくとも1つの他のSOの質問で述べられているように、Python構文を教えたりセキュリティホールを導入したりすることについては心配していません。しかし、構成コードがFishkillに分岐し、ホストアプリをくさびにするのが心配です。ホストアプリがこれらの問題をトラップし、診断エラー情報を表示することを望んでいます。

Python構成ファイルに対してこの種のサンドボックスを試した人はいますか?そして、もしそうなら、どのようなテクニックが有用であることが証明され、そして私が知っておくべき落とし穴は何でしたか?

4

2 に答える 2

3

一部の内部ツールでこれを行います

私たちが行うことは、例外の問題から私たちを保護し、ユーザーが構成スクリプトで過度に創造的になろうとする試みを思いとどまらせます。ただし、無限ループや積極的に悪意のあるサードパーティから私たちを保護するものではありません。

ここでのアプローチの中核は、ロックダウンされたexecでスクリプトを実行することです。

  1. まず、__組み込みの__モジュールを調べて、触れてほしくないものすべて、特に__インポート__を削除します。実際には、元の値をバックアップし、途中でそれらを削除してから、戻る途中で元の値を復元するコンテキストマネージャーでこれを行います。

  2. 次に、構成スクリプトの名前空間となる空の辞書を作成します。

  3. 次に、名前空間を使用して構成を実行します。

  4. もちろん、execは何かをキャッチすることを除いて、tryにラップされています。

  5. 最後に、名前空間を調べて、関心のある変数を抽出します。

ここで注意すべき点:

  1. 構成スクリプトに役立つ可能性のあるものを名前空間に事前入力したくなるかもしれませんが、ホストプログラムへのフックをすばやく開くように注意する必要があります。

  2. 構成スクリプトは引き続き関数とクラスを作成できるため、たとえば文字列のように見えるものが返される可能性がありますが、実際には実行可能コードの任意のブロブです。

これらのために、構成スクリプトが純粋なプリミティブデータ構造(通常はint、strings、lists、tuples、Noneのみ)を生成し、それを個別に検証するという制限を課します。

于 2010-09-12T23:48:37.587 に答える
2

残念ながら、標準のPythonでこの問題についてできることは多くありません。Pythonインタープリターが「構成コード」を実行している場合、そのコードは、ホストプログラムにアクセスしたり、制御を返さなかったりするなど、好きなことを実行できます。別のプロセスで構成コードを実行すると役立つ場合がありますが、ホストと構成コード間の相互作用も制限されます。

最善の策は、PyPyプロジェクトのサンドボックス機能を確認することです。これはあなたが必要とするものかもしれませんが、統合するためにあなたの側でかなりの作業を伴うかもしれません。

Pythonサンドボックス化のためのrexecに代わるものはありますか?このトピックについても説明します。

また、この問題が実際にあなたにとってどれほど重要であるかも自問する必要があります。それはあなたのユースケースと誰が構成コードを書くのかによると思います。

于 2009-11-18T18:07:53.083 に答える