Python の eval() と ast.literal_eval() の使用 質問する

Python の eval() と ast.literal_eval() の使用 質問する

eval()解決策として思いついたコードがいくつかある状況があります。eval()これまで使用したことはありませんが、それが引き起こす可能性のある危険性について多くの情報に遭遇しました。そうは言っても、私はそれを使用することに非常に慎重です。

私の状況は、ユーザーからの入力があるということです:

datamap = input('Provide some data here: ')

datamap辞書が必要な場所。検索してみたところ、eval()これが解決できることがわかりました。データを使用する前に入力の型をチェックできるかもしれないし、それが有効なセキュリティ対策になるだろうと思いました。

datamap = eval(input('Provide some data here: ')
if not isinstance(datamap, dict):
    return

ドキュメントを読みましたが、これが安全かどうかはまだわかりません。eval は、データが入力されるとすぐに評価するのでしょうか、それとも変数がdatamap呼び出された後に評価するのでしょうか?

astモジュールだけが.literal_eval()安全な選択肢なのでしょうか?

ベストアンサー1

datamap = eval(input('Provide some data here: '))安全かどうか判断する前に実際にコードを評価することを意味します。関数が呼び出されるとすぐにコードを評価します。の危険性eval

ast.literal_eval入力が有効な Python データ型でない場合は例外が発生するため、有効な Python データ型でない場合はコードは実行されません。

ast.literal_eval必要なときにいつでも使用可能eval通常、リテラル Python ステートメントを評価するべきではありません。

おすすめ記事