ホームページ >バックエンド開発 >Python チュートリアル >「eval」を使用せずに文字列辞書を Python 辞書に安全に変換するにはどうすればよいですか?

「eval」を使用せずに文字列辞書を Python 辞書に安全に変換するにはどうすればよいですか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-12-22 05:58:13174ブラウズ

How Can I Safely Convert a String Dictionary to a Python Dictionary Without Using `eval`?

Eval を使用せずに辞書の文字列表現を辞書に変換する

ここでのタスクには、辞書の文字列表現を次の形式に変換することが含まれます。実際の Python 辞書。 eval は簡単​​なオプションですが、セキュリティの脆弱性に関する懸念があります。この記事では、組み込みの ast.literal_eval 関数を使用した代替方法について説明します。

ast.literal_eval 関数

ast.literal_eval は、次の式を評価するために設計された関数です。文字列、数値、リスト、タプル、辞書、ブール値、なしなどのリテラル構造のみが含まれます。潜在的なセキュリティ リスクを防ぐために入力を制限するため、eval と比較して安全なアプローチが提供されます。

使用法

ast.literal_eval を利用するには、ast モジュールをインポートして渡します。引数としての辞書の文字列表現。たとえば、次の文字列について考えてみましょう:

s = "{'muffin' : 'lolz', 'foo' : 'kitty'}"

この文字列を ast.literal_eval を使用して辞書に変換することは、次のように簡単です:

>>> ast.literal_eval(s)
{'muffin': 'lolz', 'foo': 'kitty'}

セキュリティに関する考慮事項

ast.literal_eval を使用すると、発生する可能性のあるインジェクション攻撃を効果的に保護できます。評価で。 Eval を使用すると、ユーザー入力が Python コードとして動的に実行されるため、悪意のあるコードが挿入されるリスクが高まります。対照的に、ast.literal_eval は入力をリテラル構造のみに制限し、そのような攻撃を防ぎます。

違いを説明するために、次の 2 つの式の評価を比較します。 :

# Using eval, which can be risky
eval("shutil.rmtree('mongo')")

# Using ast.literal_eval, which is safer
ast.literal_eval("shutil.rmtree('mongo')")

示されているように、eval を使用した安全でないアプローチは重大なシステム エラーを引き起こす可能性があります。 ast.literal_eval は、不正な形式の文字列を正しく識別し、エラーをスローします。

結論

要約すると、ast.literal_eval は、辞書の文字列表現を変換する安全かつ効果的な方法を提供します。 Python 辞書に。 eval とは異なり、リテラル構造の評価を可能にしながら、悪意のあるコード インジェクションから保護します。これにより、ユーザー入力や信頼できないソースからのデータを処理するのに理想的な選択肢となります。

以上が「eval」を使用せずに文字列辞書を Python 辞書に安全に変換するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。