7

このシナリオで発生する可能性のあるセキュリティ上の悪用はありますか?

eval(repr(unsanitized_user_input), {"__builtins__": None}, {"True":True, "False":False})

unsanitized_user_inputstr オブジェクトです。文字列はユーザ​​ーが生成したものであり、厄介な可能性があります。私たちの Web フレームワークが私たちを裏切らなかったと仮定すると、これは Python ビルトインからの真に正直な str インスタンスです。

これが危険な場合、入力を安全にするために何かできることはありますか?

文字列に含まれているものは絶対に実行したくありません。

以下も参照してください。

質問に不可欠ではない(私が信じている)より大きな文脈は、私たちが何千ものこれらを持っているということです:

repr([unsanitized_user_input_1,
      unsanitized_user_input_2,
      unsanitized_user_input_3,
      unsanitized_user_input_4,
      ...])

場合によってはネストされます:

repr([[unsanitized_user_input_1,
       unsanitized_user_input_2],
      [unsanitized_user_input_3,
       unsanitized_user_input_4],
       ...])

それ自体が で文字列に変換されrepr()、永続ストレージに置かれ、最終的に eval でメモリに読み戻されます。

Eval は、pickle や simplejson よりもはるかに高速に永続ストレージから文字列を逆シリアル化しました。インタープリターは Python 2.5 であるため、json と ast は使用できません。C モジュールは許可されておらず、cPickle は許可されていません。

4

5 に答える 5

19

これは確かに危険であり、最も安全な代替手段はast.literal_eval(標準ライブラリのastモジュールを参照) です。astもちろん、生成された AST を評価する前に (リテラルになる場合)、変数などの評価を提供するために を構築および変更できます。

の可能性のあるエクスプロイトはeval、手に入れることができる任意のオブジェクトから始まり(Trueここで言う)、 .__class_ を介してそのタイプオブジェクトなどに行きobject、その後、そのサブクラスを取得します...基本的には、任意のオブジェクトタイプに到達して大破する可能性があります大混乱。より具体的に言うことはできますが、公開フォーラムでは行いたくありません (エクスプロイトはよく知られていますが、いまだにそれを無視する人がどれだけいるかを考えると、スクリプト キディ志望者に公開すると事態が悪化する可能性があります。無害化されていないものは避けevalてください。ユーザー入力と幸せな生活!-)。

于 2009-07-11T01:33:02.293 に答える
8

何も改ざんされていない Python ビルトインのインスタンスでunsanitized_user_inputあることを疑う余地なく証明できれば、これは常に安全です。実際、そのようなすべての文字列オブジェクトに対して、strこれらの追加の引数がすべてなくても安全です。eval(repr(astr)) = astr文字列を入れると、文字列が返されます。あなたがしたのは、それをエスケープしてエスケープしないことだけでした。

これはすべて、それはあなたが望むものではないと私に思わせeval(repr(x))ます-誰かが文字列のように見えるがそうではないオブジェクトをあなたに与えない限り、コードは決して実行されunsanitized_user_inputませんが、それは別の問題です-あなたがしようとしていない限り可能な限り遅い方法で文字列インスタンスをコピーします:D.

于 2009-07-11T01:42:00.457 に答える
3

一般に、にもコードを投稿させないでください。

いわゆる「有給のプロ プログラマー」は、実際に機能するコードを書くのに十分な時間を費やしています。

正式な QA の恩恵を受けずに、匿名の公開者からコードを受け入れることは、考えられるすべてのシナリオの中で最悪です。

プロのプログラマーは、しっかりとした正式な QA がなければ、ほぼすべての Web サイトのハッシュを作成します。実際、私は有給の専門家が作成した信じられないほど悪いコードをリバース エンジニアリングしています。

専門家ではない人 (QA の邪魔にならない人) がコードを投稿できるようにするという考えは、本当に恐ろしいものです。

于 2009-07-11T01:38:39.417 に答える
1
repr([unsanitized_user_input_1,
      unsanitized_user_input_2,
      ...

...unsanitized_user_inputstrオブジェクトです

データベースに格納するために文字列をシリアライズする必要はありません..

あなたが言ったように、これらがすべて文字列である場合、なぜ文字列を単にに格納できないのですdb.StringListPropertyか?

ネストされたエントリはもう少し複雑かもしれませんが、なぜそうなるのでしょうか? データベースからデータを取得するために eval に頼らなければならない場合、おそらく何か間違ったことをしている..

unsanitized_user_input_xそれぞれを独自の行として保存db.StringPropertyし、参照フィールドでグループ化できませんでしたか?

あなたが何を達成しようとしているのか私にはわからないので、どちらも当てはまらないかもしれませんが、私のポイントは、あなたが頼る必要のない方法でデータを構造化することはできませんかeval?セキュリティ上の問題ではありません)?

于 2009-07-11T16:03:55.717 に答える