>  기사  >  백엔드 개발  >  Python에서 eval 함수와 ast.literal_eval 사용의 차이점 소개(그림 및 텍스트)

Python에서 eval 함수와 ast.literal_eval 사용의 차이점 소개(그림 및 텍스트)

黄舟
黄舟원래의
2017-08-10 14:00:0211003검색

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/*')

🎜 그러면 eval은 No입니다. 무슨 일이 있어도 그녀는 컴퓨터의 디렉토리 구조를 보여주고, 파일을 읽고, 파일을 삭제합니다... 디스크 포맷과 같은 더 심각한 작업인 경우에도 그녀는 그것을 수행할 것입니다! ! ! 🎜🎜🎜🎜여기에 또 다른 안전한 처리 방법인 ast.literal_eval이 있습니다. 이에 대한 stackoverflow 및 Python 공식 설명을 먼저 읽어보세요! 🎜🎜🎜🎜🎜🎜stackoverflow🎜🎜🎜 🎜🎜 Python 공식 문서 🎜🎜🎜🎜🎜 ast 모듈에 대해 간단히 이야기해 보겠습니다. Python 응용 프로그램이 추상 구문 분석을 처리하도록 돕는 것입니다. 이 모듈의 literal_eval() 함수는 계산 후 계산할 내용이 유효한 Python 유형인지 여부를 결정합니다. 그렇다면 작업이 수행되고, 그렇지 않으면 작업이 수행되지 않습니다. 🎜🎜🎜예를 들어 위의 계산 연산과 위험한 연산을 ast.literal_eval()로 대체하면 실행이 거부됩니다. 🎜🎜🎜값 오류, 잘못된 문자열입니다! 🎜🎜🎜🎜그리고 합법적인 Python 유형만 실행됩니다. 이는 시스템의 위험을 크게 줄여줍니다! 🎜🎜🎜🎜그래서 보안상의 이유로 문자열을 수행할 때 유형 변환하려면 ast.literal_eval() 함수를 사용하는 것이 가장 좋습니다! 🎜🎜🎜🎜Summary🎜🎜🎜

위 내용은 Python에서 eval 함수와 ast.literal_eval 사용의 차이점 소개(그림 및 텍스트)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.