当前位置: 首页 > 面试题库 >

“ safe_eval”真的安全吗?

司空鸿熙
2023-03-14
问题内容

我正在寻找一个“安全”的评估函数,以实现类似于电子表格的计算(使用numpy / scipy)。

由于明显的不可修复的安全性问题,自2.3起,已从Python中删除了执行此功能的功能(rexec模块)。有一些第三方黑客声称可以做到这一点-
我发现的最周到的解决方案是 此Python
Cookbok食谱
“ safe_eval”。

如果使用此命令(或类似方法)来保护自己免受恶意代码的侵害,我是否相当安全?还是我坚持编写自己的解析器?有谁知道更好的选择吗?

编辑:我刚发现RestrictedPython,它是Zope的一部分。欢迎对此发表任何意见。


问题答案:

我想取决于您对保险柜的定义。许多安全性取决于您传入的内容以及上下文中允许通过的内容。例如,如果传入文件,则可以打开任意文件:

>>> names['f'] = open('foo', 'w+')
>>> safe_eval.safe_eval("baz = type(f)('baz', 'w+')", names)
>>> names['baz']
<open file 'baz', mode 'w+' at 0x413da0>

此外,环境非常受限制(您不能传递模块),因此,您不能简单地传递诸如re或random之类的实用程序功能的模块。

另一方面,您不需要编写自己的解析器,只需为python ast编写自己的评估器即可:

>>> import compiler
>>> ast = compiler.parse("print 'Hello world!'")

这样,希望您可以实现安全导入。另一个想法是使用Jython或IronPython并利用Java / .Net沙箱功能。



 类似资料:
  • 问题内容: 在Java中,访问修饰符被认为是安全的,因为它在类外部不可见。然后外面的世界也不知道这种方法。 但是我认为Java反射可以用来打破这一规则。考虑以下情况: 现在从另一堂课我将获得信息: 这时我只是觉得私有方法仍然安全,因为要做上面的事情我们必须知道方法名称。但是,如果类包含由其他人编写的私有方法,那么我们将看不到那些。 但是,由于下面的代码行,我的观点变得无效。 现在,它包含了需要做的

  • 问题内容: 我在这里谈论基本用法: 谷歌搜索以上问题,说是,但不是 -接受的答案是,是,但后续行动是否;Spring.io表示是和否,并且似乎是Java EE专家的Adam Bien给出了不合格的yes。 我对一个简单的调度bean的经验表明答案是否定的: 抽象界面: 开始于: 如果我打印出,即使我在两次调用之间仍在同一线程上,也会得到: 严重:java.lang.IllegalStateExce

  • 此">答案提供了对IntStream进行分区的实现: 但是它的编辑提到这个实现不是线程安全的。然而,据我所知,收集器创建了一个单独的

  • 我一直有一个问题,即JWT是否真的安全?因为在对声明和有效载荷进行编码时,我们可以很容易地对令牌进行解码,并且在那里的网站上也很好地给出了这种解码。所以我的观点是,任何人都可以简单地使用burpsuite之类的工具更改auth头,并提供一些其他有效的令牌,对假用户进行身份验证。按照许多人的建议,将令牌存储在本地存储中也可能不太安全。所以我的问题是,与加密的cookie或会话相比,它真的是安全的吗?

  • 我有一个第三方图书馆提供一个类。他们的文件说: 我做了一些测试,创建了100个线程。实际上,如果我将同一个对象传递给所有100个线程,就会出现线程安全问题,但如果每个线程都创建自己的类实例,这些问题就会消失。 我在这里使用的是.NET4.0。在我的应用程序中,有多个线程想要使用这个类,但是我不想创建和销毁超过必要的对象(它们应该在应用程序的生存期内存在),所以我希望每个线程都有一个。这是否适合使用

  • 问题内容: 尽管在Java中使用’final’关键字有很多原因,但我不断反复听到的一个原因是它使您的代码更安全。尽管在这种琐碎的情况下这似乎很有意义: 使用final关键字,您希望没有恶意代码能够更改变量passwordHash。但是,使用反射可以更改passwordHash字段上的最终修饰符。 那么“最终”是否提供任何真正的安全性,还是仅仅是安慰剂? 编辑: 有一些非常有趣的讨论,我希望我可以接