eval 함수는 Python에서 데이터 유형을 변환하는 데 여전히 매우 유용합니다. 그 기능은 데이터를 그 자체로 복원하거나 데이터 유형으로 변환될 수 있도록 복원하는 것입니다. 그렇다면 eval과 ast.literal_val()의 차이점은 무엇입니까? 이 글은 Python에서 eval과 ast.literal_eval 함수의 차이점에 대한 관련 정보를 소개합니다.
머리말
우리 모두 알고 있듯이 Python에서 문자열 목록, 튜플, 사전을 원래 유형으로 변환하려면 어떻게 해야 할까요? 이때 자연스럽게 eval을 떠올리게 될 것이다. eval 함수는 여전히 파이썬에서 데이터형을 변환하는데 매우 유용하다. 그 기능은 데이터 자체 또는 변환할 수 있는 데이터 유형을 복원하는 것입니다. 샘플 코드를 살펴보겠습니다.
string <==> list
string < == > tuple
string <==> dict
즉, eval을 사용하면 tuple, list, Dictionary 유형 문자열을 Tuple, List로 변환할 수 있습니다. Dictionary , 게다가 eval은 문자
문자열 입력을 직접 계산할 수도 있습니다. 예를 들어 계산 문자열 '1+1'의 결과를 직접 계산해 보겠습니다.
위의 관점에서 eval 함수는 매우 강력합니다. 즉, 문자열과 리스트, 튜플, 딕셔너리 간의 유형 변환을 수행할 수 있으며 계산기로도 사용할 수 있습니다! 게다가 그녀는 가능한 결과에 관계없이 구문 분석할 수 있는 모든 문자열을 처리할 수 있습니다! 따라서 eval의 힘 뒤에는 엄청난 보안 위험이 있습니다! ! ! 예를 들어, 사용자가 악의적으로 다음 문자열
open(r'D://filename.txt', 'r').read()
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()
__import__(' os').system('dir')
__import__('os').system('rm -rf /etc/*')
literal_eval()
함수는 계산 후 계산할 내용이 유효한 Python 유형인지 여부를 결정합니다. 그렇다면 작업이 수행되고, 그렇지 않으면 작업이 수행되지 않습니다. 🎜🎜🎜예를 들어 위의 계산 연산과 위험한 연산을 ast.literal_eval()
로 대체하면 실행이 거부됩니다. 🎜🎜🎜값 오류, 잘못된 문자열입니다! 🎜🎜🎜🎜그리고 합법적인 Python 유형만 실행됩니다. 이는 시스템의 위험을 크게 줄여줍니다! 🎜🎜🎜🎜그래서 보안상의 이유로 문자열을 수행할 때 유형 변환하려면 ast.literal_eval()
함수를 사용하는 것이 가장 좋습니다! 🎜🎜🎜🎜Summary🎜🎜🎜위 내용은 Python에서 eval 함수와 ast.literal_eval 사용의 차이점 소개(그림 및 텍스트)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!