相关疑难解决方法(0)

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

我有一些代码的情况,eval()作为一种可能的解决方案.现在我从来没有使用eval()过,但是,我已经发现了很多关于它可能造成的潜在危险的信息.也就是说,我对使用它非常谨慎.

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

datamap = raw_input('Provide some data here: ')
Run Code Online (Sandbox Code Playgroud)

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

datamap = eval(raw_input('Provide some data here: ')
if not isinstance(datamap, dict):
    return
Run Code Online (Sandbox Code Playgroud)

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

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

python eval abstract-syntax-tree

154
推荐指数
6
解决办法
14万
查看次数

Python:使eval安全

我想要一种简单的方法在Python中执行"计算器API".

现在,我并不关心计算器将支持的确切功能集.

我希望它接收一个字符串,"1+1"并在我们的例子中返回一个包含结果的字符串"2".

有没有办法让eval这种东西安全?

首先,我会这样做

env = {}
env["locals"]   = None
env["globals"]  = None
env["__name__"] = None
env["__file__"] = None
env["__builtins__"] = None

eval(users_str, env)
Run Code Online (Sandbox Code Playgroud)

这样调用者就不会搞乱我的局部变量(或看到它们).

但我相信我在这里监督很多.

eval安全问题是否可以解决,或者是否存在太多微小的细节以使其正常工作?

python eval

39
推荐指数
2
解决办法
3万
查看次数

Python eval:如果我禁用内置和属性访问,它仍然很危险吗?

我们都知道这eval很危险,即使你隐藏了危险的函数,因为你可以使用Python的内省功能深入挖掘并重新提取它们.例如,即使您删除__builtins__,也可以使用它来检索它们

[c for c in ().__class__.__base__.__subclasses__()  
 if c.__name__ == 'catch_warnings'][0]()._module.__builtins__
Run Code Online (Sandbox Code Playgroud)

但是,我见过的每个例子都使用属性访问.如果我禁用所有内置函数禁用属性访问(通过使用Python令牌化程序对输入进行标记,并在具有属性访问令牌时拒绝它),该怎么办?

在你问之前,不,对于我的用例,我不需要其中任何一个,所以它不会太瘫痪.

我想要做的是让SymPy的同情功能更安全.目前,它对输入进行了标记,对其进行了一些转换,并在命名空间中对其进行了演绎.但它不安全,因为它允许属性访问(即使它真的不需要它).

python eval python-internals

35
推荐指数
5
解决办法
4898
查看次数

Numpy从变量切片

我正在尝试使用在变量中预定义的切片来切割numpy数组.这有效:

b = fromfunction(lambda x,y: 10*x+y, (5,4),dtype=int) # Just some matrix

b[1:3,1:3]
# Output:
# array([[11, 12],
#       [21, 22]])
Run Code Online (Sandbox Code Playgroud)

但我想做的是这样的事情:

slice = "1:3,1:3"
b[slice]
# Output:
# array([[11, 12],
#       [21, 22]])
Run Code Online (Sandbox Code Playgroud)

对我来说切片变量的类型并不重要,我只是以字符串为例.如何保存这样的切片说明符?

python numpy slice

10
推荐指数
2
解决办法
5801
查看次数