このシナリオで発生する可能性のあるセキュリティ上の悪用はありますか?
eval(repr(unsanitized_user_input), {"__builtins__": None}, {"True":True, "False":False})
はunsanitized_user_input
str オブジェクトです。文字列はユーザーが生成したものであり、厄介な可能性があります。私たちの 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 は許可されていません。