GVKun编程网logo

使用python的eval()与ast.literal_eval()?(python,eval)

7

这篇文章主要围绕使用python的eval和与ast.literal_eval展开,旨在为您提供一份详细的参考资料。我们将全面介绍使用python的eval的优缺点,解答与ast.literal_ev

这篇文章主要围绕使用python的eval与ast.literal_eval展开,旨在为您提供一份详细的参考资料。我们将全面介绍使用python的eval的优缺点,解答与ast.literal_eval的相关问题,同时也会为您带来ast.literal_eval用于python中的变量吗?、ast.literal_eval(转)、JavaScript call()和apply()与bind()?、JavaScript的eval()什么时候不是evil?的实用方法。

本文目录一览:

使用python的eval()与ast.literal_eval()?(python,eval)

使用python的eval()与ast.literal_eval()?(python,eval)

我遇到了一些代码,eval()将其作为可能的解决方案。现在,我从来没有使用eval()过,但是,我遇到了很多有关它可能引起的潜在危险的信息。也就是说,我对使用它非常谨慎。

我的情况是我有一个用户输入:

datamap = raw_input(''Provide some data here: '')

哪里datamap需要一本字典。我四处搜寻,发现eval()可以解决这个问题。我认为我可以在尝试使用数据之前检查输入的类型,这将是可行的安全预防措施。

datamap = eval(raw_input(''Provide some data here: '')if not isinstance(datamap, dict):    return

我通读了文档,但仍不清楚这是否安全。eval是否在输入数据后或datamap调用变量后立即评估数据?

该ast模块是.literal_eval()唯一安全的选择吗?

答案1

小编典典

169

datamap = eval(raw_input(''Provide some data here: ''))表示你实际上在认为代码不安全之前对其进行了评估。调用该函数后,它将立即评估代码。另请参阅的危险eval。

ast.literal_eval 如果输入不是有效的Python数据类型,则会引发异常,因此如果输入无效,则不会执行代码。

使用ast.literal_eval时,你需要eval。通常,你不应该评估文字Python语句。

ast.literal_eval用于python中的变量吗?

ast.literal_eval用于python中的变量吗?

假设我有一个文件example.py:import example

VVV = 2

DictionaryNameB = {
    'a'                   : VVV,'bb'                  : 'SomethingB','c'                   : False,'ccc'                 : None,'dddd'                : 'true','eeeee'               : 0.123456,'f'                   : 2,'h'                   : [1,2,3]
}

我写了一个使用的函数ast.literal_eval()

def getDicFromFile(self,dic_name):
    with open( 'example.py' ) as f:
        file_data = f.read()
    match = re.findall('%s[^{]+\{[^\}]+\}' % dic_name,file_data,re.MULTILINE)[0]
    # print(match)
    dicObject = ast.literal_eval(match[len(dic_name)+3:])
    return dicObject

我收到错误引发ValueError(’formaled string’); ValueError:格式错误的字符串

我知道ast.literal_eval()无法解码变量VVV,还有另一种方法吗?

ast.literal_eval(转)

ast.literal_eval(转)

eval函数在Python中做数据类型的转换还是很有用的。它的作用就是把数据还原成它本身或者是能够转化成的数据类型。那么eval和ast.literal_val()的区别是什么呢?本文将大家介绍关于Python中函数eval和ast.literal_eval区别的相关资料,需要的朋友可以参考下。

 

前言

众所周知在Python中,如果要将字符串型的list,tuple,dict转变成原有的类型呢? 这个时候你自然会想到eval. eval函数在python中做数据类型的转换还是很有用的。它的作用就是把数据还原成它本身或者是能够转化成的数据类型.下面来看看示例代码:

string <==> list

分享图片

string <==> tuple

分享图片

string <==> dict

分享图片

也就是说,使用eval可以实现从元祖,列表,字典型的字符串到元祖,列表,字典的转换,此外,eval还可以对字符
串型的输入直接计算。比如,她会将‘1+1‘的计算串直接计算出结果。

分享图片

从上面来看,eval功能可谓非常强大,即可以做string与list,dict之间的类型转换,还可以做计算器使用!更有甚者,可以对她能解析的字符串都做处理,而不顾忌可能带来的后果!所以说eval强大的背后,是巨大的安全隐患!!! 比如说,用户恶意输入下面的字符串

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()函数!

总结

以上就是Python中关于eval函数与ast.literal_eval使用的区别介绍(图文)的详细内容,更多请关注小编网其它相关文章!

JavaScript call()和apply()与bind()?

JavaScript call()和apply()与bind()?

如何解决JavaScript call()和apply()与bind()??

.bind()当你希望稍后在特定上下文中调用该函数时使用,该事件在事件中很有用。当你想立即调用该函数并修改上下文时,请使用.call().apply()

调用/应用立即调用该函数,而bind返回一个函数,该函数在以后执行时将具有用于调用原始函数的正确上下文集。这样,你可以在异步回调和事件中维护上下文。

我经常这样做:

function MyObject(element) {
    this.elm = element;

    element.addEventListener(''click'', this.onClick.bind(this), false);
};

MyObject.prototype.onClick = function(e) {
     var t=this;  //do something with [t]...
    //without bind the context of this function wouldn''t be a MyObject
    //instance as you would normally expect.
};

我在Node.js中将它广泛用于异步回调,我想为其传递成员方法,但仍希望上下文成为启动异步操作的实例。

一个简单,简单的bind实现是:

Function.prototype.bind = function(ctx) {
    var fn = this;
    return function() {
        fn.apply(ctx, arguments);
    };
};

它还有更多的功能(就像传递其他args一样),但是你可以阅读更多有关它的内容,并查看MDN上的实际实现。

希望这可以帮助。

解决方法

我已经知道了,apply并且call是类似的函数集this(函数的上下文)。

区别在于我们发送参数的方式(手动vs数组)

题:

但是什么时候应该使用该 bind()方法?

var obj = {
  x: 81,getX: function() {
    return this.x;
  }
};

alert(obj.getX.bind(obj)());
alert(obj.getX.call(obj));
alert(obj.getX.apply(obj));

JavaScript的eval()什么时候不是evil?

JavaScript的eval()什么时候不是evil?

我正在编写一些JavaScript代码来解析用户输入的功能(用于类似于电子表格的功能)。解析了公式之后,我 可以
将其转换为JavaScript并eval()在其上运行以产生结果。

但是,eval()如果能避免,我总是避免使用它,因为它是evil的(而且,无论对与错,我一直认为它在JavaScript中更为evil,因为要评估的代码可能会被用户更改)。

那么,何时可以使用它呢?

答案1

小编典典

我想花点时间解决您提出问题的前提-eval()是“ evil”。编程语言人员所用的“ evil”
一词通常表示“危险”,或更确切地说,“使用简单的命令即可造成很多伤害”。那么,什么时候可以使用危险的东西呢?当您知道危险所在以及采取适当的预防措施时。

到目前为止,让我们看一下使用eval()的危险。就像其他所有事物一样,可能存在许多小的隐患,但是性能和代码注入是两个大隐患-eval()被认为是邪恶的原因。

  • 性能-eval()运行解释器/编译器。如果您的代码已编译,那么这将是一个很大的成功,因为您需要在运行时中途调用可能很重的编译器。但是,JavaScript仍主要是一种解释性语言,这意味着在一般情况下调用eval()不会对性能造成很大的影响(但请参见下面的我的特别评论)。
  • 代码注入-eval()可能以提升的特权运行一串代码。例如,以管理员/超级用户身份运行的程序永远都不想使用eval()用户输入,因为该输入可能是“ rm -rf / etc / important-file”或更糟。同样,浏览器中的JavaScript也不存在此问题,因为该程序无论如何都以用户自己的帐户运行。服务器端JavaScript可能有此问题。

根据您的具体情况。据我了解,您是在自行生成字符串,因此,假设您谨慎地不允许生成“ rm -rf something-
important”之类的字符串,就不会有代码注入的风险(但是请记住,这 非常非常 在一般情况下 很难
确保这一点)。另外,我相信,如果您正在浏览器中运行,则代码注入的风险很小。

至于性能,您必须权衡其易编码性。我认为,如果要解析公式,则最好在解析过程中计算结果,而不是运行另一个解析器(eval()内部的那个)。但是使用eval()进行编码可能会更容易,并且性能下降可能不会引起注意。在这种情况下,eval()看起来比其他任何可以节省您时间的函数都更加evil。

关于使用python的eval与ast.literal_eval的介绍已经告一段落,感谢您的耐心阅读,如果想了解更多关于ast.literal_eval用于python中的变量吗?、ast.literal_eval(转)、JavaScript call()和apply()与bind()?、JavaScript的eval()什么时候不是evil?的相关信息,请在本站寻找。

本文标签: