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

Python'eval'用于列表反序列化的安全性

呼延衡
2023-03-14
问题内容

在这种情况下是否可能发生任何安全漏洞利用:

eval(repr(unsanitized_user_input), {"__builtins__": None}, {"True":True, "False":False})

unsanitized_user_inputstr对象在哪里。该字符串是用户生成的,可能令人讨厌。假设我们的网络框架没有让我们失败,那是一个来自Python内置函数的真正诚实的str实例。

如果这样做很危险,我们可以对输入进行任何操作以使其安全吗?

我们当然 希望执行字符串中包含的任何东西。

对于这个问题,我认为不是必不可少的更大范围是,我们有成千上万个这样的环境:

repr([unsanitized_user_input_1,
      unsanitized_user_input_2,
      unsanitized_user_input_3,
      unsanitized_user_input_4,
      ...])

在某些情况下嵌套:

repr([[unsanitized_user_input_1,
       unsanitized_user_input_2],
      [unsanitized_user_input_3,
       unsanitized_user_input_4],
       ...])

本身会使用转换为字符串repr(),并放入永久存储中,最后使用eval读回内存。

Eval从持久性存储中反序列化字符串的速度比pickle和simplejson快得多。解释器是Python
2.5,因此json和ast不可用。不允许使用C模块,也不允许使用cPickle。


问题答案:

这确实是危险的,最安全的选择是ast.literal_eval(请参阅标准库中的ast模块)。当然,您可以构建和更改一个ast,以便在评估结果AST之前(当其取决于文字时)提供变量评估等。

start的可能利用是eval从它可以动手的任何对象开始(True在这里说),然后通过.__
class_转到其类型对象,依此类推,直到object,然后获取其子类…基本上它可以到达任何对象类型并破坏破坏。我可以更具体一些,但我不希望在公共论坛上使用(该漏洞众所周知,但是考虑到仍然有很多人忽略它,将其透露给脚本小子可能会使情况变得更糟…只是避免eval未经消毒的情况而已)用户输入并从此过上幸福的生活!-)。



 类似资料:
  • 从捆绑包反序列化LinkedHashMaps的正确方法是什么?完全可以做到吗?如果不是,我如何保持顺序而不在中间添加另一层来跟踪位置,这将涉及更改大量现有代码?

  • 我想将json反序列化到类Foo: IBar有两个实现,但是当反序列化时,我总是想使用第一个实现。(理想情况下,这将使问题变得更容易,因为不需要运行时类型检查) 我相信我可以编写自定义反序列化程序,但我觉得一定有更简单的方法。 我找到了这个注释,它在没有列表的情况下非常有效。

  • 问题内容: 在Apache Jackson和Jackson一起使用Apache Jersey进行JSON序列化时(在服务器和客户端上),在反序列化通用List时遇到问题。 我正在生成的JSON如下,“数据”中的所有3个类都实现“ CheckStatusDetail”: 产生此JSON的对象如下所示,我在客户端使用相同的类: 自从我将此注释添加到我的CheckStatusDetail接口后,就应用了

  • 我试图序列化和反序列化类的列表(vb),显然里面只有派生类的实例。 我用修饰了list参数,获得如下输出: 但是当我反序列化它时,我一直说他不能反序列化抽象类。 http://james.newtonking.com/json/help/index.html?topic=html/SerializeTypeNameHandling.htm 删除注释行它可以工作!

  • 我正在创建一个具有嵌套列表的API。Jackson似乎是一个创建对象的好工具,但我不太清楚如何嵌套列表,我想知道这是否可能。 我的对象看起来像这样。 我希望有一种方法可以将其映射到json,看起来像: 我们希望能够做到这一点,以便我们可以将属性添加到列表中。

  • 当使用ObjectMapper将json字符串转换为实体时,我可以将其设置为通用的: 现在让我们假设我想读集合。我可以做到: 我想写一个与上述方法等效的方法,但用于集合。因为java中不能有泛型数组,所以这样的东西是行不通的: 这里有一个几乎可行的解决方案: 问题是它没有反序列化为的列表,而是。有没有什么方法可以更进一步,如下所示?