ホームページ  >  記事  >  バックエンド開発  >  Python での eval 関数と ast.literal_eval の使用の違いの紹介 (画像とテキスト)

Python での eval 関数と ast.literal_eval の使用の違いの紹介 (画像とテキスト)

黄舟
黄舟オリジナル
2017-08-10 14:00:0211018ブラウズ

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()

そこで、別の安全な処理メソッド ast.literal_eval を紹介します。これについては、まず stackoverflow と Python 公式の説明を読んでください。

stackoverflow🎜🎜🎜 🎜🎜 Python 公式ドキュメント 🎜🎜🎜🎜🎜 ast モジュールについて簡単に説明しましょう。これは、Python アプリケーションが抽象構文解析を処理できるようにするためのものです。このモジュールの literal_eval() 関数は、計算後に計算対象のコンテンツが正当な Python 型であるかどうかを判断します。そうであれば、操作は実行されます。そうでない場合は、操作は実行されません。 🎜🎜🎜例えば、上記の計算演算や危険な演算をast.literal_eval() に置き換えると実行が拒否されます。 🎜🎜🎜値エラー、不正な文字列! 🎜🎜🎜🎜 そして、正当な Python タイプのみが実行されます。これにより、システムのリスクが大幅に軽減されます。 🎜🎜🎜🎜セキュリティ上の理由から、型を実行するときは文字列変換するには、ast.literal_eval() 関数を使用するのが最善です。🎜🎜🎜🎜概要🎜🎜🎜

以上がPython での eval 関数と ast.literal_eval の使用の違いの紹介 (画像とテキスト)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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