ホームページ >バックエンド開発 >Python チュートリアル >Python での eval 関数と ast.literal_eval の使用の違いの紹介 (画像とテキスト)
eval 関数は、Python でデータ型を変換するのに非常に役立ちます。その機能は、データをそれ自体、またはデータに変換できるデータ型に復元することです。では、eval と ast.literal_val() の違いは何でしょうか?この記事では、Python の関数 eval と ast.literal_eval の違いに関する関連情報を紹介します。必要な方は参考にしてください。
はじめに
ご存知のとおり、Python で文字列リスト、タプル、辞書を元の型に変換したい場合はどうすればよいでしょうか? このとき、当然、eval 関数は Python でデータ型を変換するのに非常に便利です。その機能は、データをそれ自体、または変換後のデータ型に復元することです。サンプル コードを見てみましょう。 == > tuple
string <==> dict
つまり、 eval を使用すると、タプル、リスト、辞書型文字列からタプル、リスト、 Dictionary 、さらに、 eval は文字
文字列入力を直接計算することもできます。たとえば、計算文字列「1+1」の結果を直接計算します。
上記の観点から見ると、eval 関数は非常に強力です。つまり、文字列とリスト、タプル、辞書の間の型変換を行うことができ、計算機としても使用できます。さらに、彼女は、起こり得る結果に関係なく、解析できるすべての文字列を処理できます。つまり、eval の強力な背後には、巨大なセキュリティ リスクが存在します。 ! ! たとえば、ユーザーが悪意を持って次の文字列
open(r'D://filename.txt', 'r').read()
__import__(' os').system('dir')
__import__('os').system('rm -rf /etc/*')
その場合、 eval は No になります何はともあれ、彼女はコンピューターのディレクトリ構造を示したり、ファイルを読んだり、ファイルを削除したり...ディスクのフォーマットなどのより本格的な操作であれば、それもやってくれます。 ! !
open(r'D://filename.txt', 'r').read()
__import__('os').system('dir')
__import__('os').system('rm -rf /etc/*')
那么eval就会不管三七二十一,显示你电脑目录结构,读取文件,删除文件.....如果是格盘等更严重的操作,她也会照做不误!!!
所以这里就引出了另外一个安全处理方式ast.literal_eval.可以先看下stackoverflow及Python官方关于这个解释!
stackoverflow
Python官方文档
简单点说ast模块就是帮助Python应用来处理抽象的语法解析的。而该模块下的literal_eval()
函数:则会判断需要计算的内容计算后是不是合法的python类型,如果是则进行运算,否则就不进行运算。
比如说上面的计算操作,及危险操作,如果换成了ast.literal_eval()
,都会拒绝执行。
报值错误,不合法的字符串!
而只会执行合法的Python类型,从而大大降低系统的危险性!
所以出于安全考虑,对字符串进行类型转换的时候,最好使用ast.literal_eval()
stackoverflow🎜🎜🎜 🎜🎜 Python 公式ドキュメント 🎜🎜🎜🎜🎜 ast モジュールについて簡単に説明しましょう。これは、Python アプリケーションが抽象構文解析を処理できるようにするためのものです。このモジュールの
literal_eval()
関数は、計算後に計算対象のコンテンツが正当な Python 型であるかどうかを判断します。そうであれば、操作は実行されます。そうでない場合は、操作は実行されません。 🎜🎜🎜例えば、上記の計算演算や危険な演算をast.literal_eval()
に置き換えると実行が拒否されます。 🎜🎜🎜値エラー、不正な文字列! 🎜🎜🎜🎜 そして、正当な Python タイプのみが実行されます。これにより、システムのリスクが大幅に軽減されます。 🎜🎜🎜🎜セキュリティ上の理由から、型を実行するときは文字列変換するには、ast.literal_eval()
関数を使用するのが最善です。🎜🎜🎜🎜概要🎜🎜🎜以上がPython での eval 関数と ast.literal_eval の使用の違いの紹介 (画像とテキスト)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。