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

Python的eval()在不受信任的字符串上的安全性吗?

濮阳立果
2023-03-14
问题内容

如果我正在使用eval()评估Python字符串,并且具有类似这样的类:

class Foo(object):
    a = 3
    def bar(self, x): return x + a

如果我不信任该字符串,会有哪些安全风险?尤其是:

  1. 是eval(string, {“f”: Foo()}, {})不安全的?也就是说,你可以从Foo实例访问os或sys还是不安全的东西?
  2. 是eval(string, {}, {})不安全的?也就是说,我可以完全通过len和list之类的内置工具访问os或sys吗?
  3. 有没有办法使内置插件在评估环境中根本不存在?

我不关心一些不安全的字符串,例如“ [0] * 100000000”,因为在最坏的情况下,它们会减慢/停止程序。我主要关心的是保护程序外部的用户数据。

显然,eval(string)在大多数情况下,没有自定义词典是不安全的。


问题答案:

您不能使用这样的黑名单方法来保护评估。请参阅Eval确实很危险,以获取输入示例,这些输入将对CPython解释器进行段隔离,提供对您喜欢的任何类的访问,等等。



 类似资料:
  • 服务工作在可信空间中的网关之后(网关验证OAuth令牌,并只给服务唯一的用户ID,在其他情况下,它重定向认证服务)。 我想在服务中使用spring安全,以能够验证用户ID的权限。 因此,我添加了 其中ContextsSOActiveProfileIdProvider.GetsSOActiveProfileId()返回uniqueUserId,GetGrantedAuthorityService.G

  • 我正在使用OpenSSL以避免为此付费。我的服务器正在运行IIS 8和Windows server 2012。 我创建证书的方式是: openssl请求-new-key cakey.pem-x509-days 1825-extensions v3_ca-out ca.crt 最后,我使用以下内容签署了证书请求: openssl x509-req-days 365-in certreq.txt-ca

  • 问题内容: 我正在尝试从字符串中读取一些BigDecimal值。假设我有以下字符串:“ 1,000,000,000.999999999999999”,我想从中获取BigDecimal。怎么做呢? 首先,我不喜欢使用字符串替换(替换逗号等)的解决方案。我认为应该有一些精巧的格式化程序为我完成这项工作。 我发现了DecimalFormatter类,但是它通过两次操作-损失了大量精度。 那么,我该怎么办

  • 我已经在练习26中,构建devpkg的时候介绍了Better String库。这个练习让你从现在开始熟悉bstring库,并且明白C风格字符串为什么十分糟糕。之后你需要修改liblcthw的代码来使用bstring。 为什么C风格字符串十分糟糕 当人们谈论C的问题时,“字符串”的概念永远是首要缺陷之一。你已经用过它们,并且我也谈论过它们的种种缺陷,但是对为什么C字符串拥有缺陷,以及为什么一直是这样

  • 问题内容: 这篇文章说,相当于 假设我有以下代码: 假设beginmt在MultiThreading类的单个实例上同时运行多次(线程号为1至15500)。是否可能存在这样的实例,它可以打印以下内容,即某些线程号丢失并且某些数字加倍? 编辑: 可以肯定地说+运算符不会引起某些不安全的发布问题吗?我认为StringBuilder可以优化为类似于实例变量的东西,在这种情况下,它可能会不安全地发布。 编辑

  • 我有个小问题。我正在用selenium以特定的配置文件打开firefox浏览器,一个flash应用程序出现了。在这个应用程序中,我需要单击一些东西,所以我使用sikuli。问题是,当使用sikuli单击按钮时,我的应用程序会在匿名配置文件中打开浏览器,从而显示“不受信任的SSL证书”。 有没有办法为火狐的匿名配置文件设置AcceptUnTrust d证书? 我想提到的是,我的java代码中已经有s