元の問題:
ユーザーに対する eval() の使用-提供された入力は危険である可能性があります。 ast モジュールの .literal_eval() はどのようにしてより安全な代替手段を提供できますか?
Eval 関数:
eval() 関数は Python ステートメントを評価します。入力には Python コードを含む文字列を指定でき、eval() はそのコードの実行結果を返します。
Eval の危険性:
ただし、eval() は意図しないコードであっても、任意のコードを実行する可能性があるため、危険です。たとえば、ユーザーが次のような入力を行った場合:
eval("import os; os.system('rm -rf *')")
現在のディレクトリ内のすべてのファイルを削除するコマンドが実行されます。
リテラル評価の使用:
eval() とは異なり、ast.literal_eval() 関数は数値リテラルのみを評価します。文字列、ブール値、辞書。これにより、任意のコードが実行されなくなるため、ユーザーが提供したデータをより安全に処理できるようになります。たとえば、提供されたコードでは:
datamap = ast.literal_eval(input('Provide some data here: '))
このコードは、辞書として解析できる場合にのみ入力を評価し、潜在的なセキュリティ リスクを防ぎます。入力が有効な辞書でない場合、ast.literal_eval() は例外を発生させます。したがって、信頼できない入力を処理するには、常に eval() よりも ast.literal_eval() を優先する必要があります。
以上がPython セキュリティ: `eval()` の代わりに `ast.literal_eval()` を使用する必要があるのはどのような場合ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。