有关Python序列化和存在的反序列化缺陷思考

本文探讨了Python序列化(如pickle和JSON)的使用,特别是pickle的潜在安全问题,包括反序列化时的代码执行缺陷。文章指出,不信任的数据不应通过pickle进行反序列化,以防止任意代码执行。解决方案包括使用白名单限制反序列化过程中的可调用对象。强调了开发人员的安全意识和选择安全的序列化模块的重要性。
摘要由CSDN通过智能技术生成

0x00 面试被问到了

前段时间面试,问到了Python序列化漏洞,问我了解吗。我说平时用过,也大概知道其序列化后是一种什么形式,但序列化漏洞没怎么关注过。心里想,Python序列化漏洞难道不是和Java还有PHP一样,都是因为敏感操作引起的吗,过分信任了输入,其实也是代码注入的一种,没什么好说的啊。

结果是自己太 naive ,Python序列化方面的问题远没有这么简单。

0x01 序列化的方式

Python的序列化主流有两种方式,一种是使用pickle模块(cPickle是pickle的C语言版本,性能有提升),一种是使用JSON格式。还有个更古老的模块叫做 marshal,不过并不推荐,官方文档说marshal存在是为了用来支持 .pyc 文件。

那pickle和marshal之间有什么区别呢?

  1. pickle会跟踪已经序列化的对象,如果有引用相同的对象,那么它将不会被再次序列化。但marshal依然会。
  2. marshal不能序列化用户自定义的对象。
  3. marshal不能保证在多个Python版本间传递。

同样的,pickle和json方式之间有什么区别吗?

  1. json的序列化输出是文本对象(unicode),而pickle序列化的输出是二进制字节(bytes),如果不明白这两者的区别可以看我的上一篇博客:Python2和Python3之间关于字符串编码处理的差别
  2. json可读性更好。
  3. json拥有广泛的兼容性,能够在Python以外的很多地方使用。而pickle只针对Python。
  4. json只能表示一部分Python内置的类型,不能表示用户自定义的类对象。当你尝试序列化一个自定义的类对象时,会抛出一个 TypeError 。而pickle则能表示大多数对象,包括用户自定义的类(绝大部分)。

还有个模块叫做 pickletools 用来分析pickle产生的数据。

所以综上,pickle是一个相对较好的Python序列化模块。

0x02 怎么使用

序列化:
pickle.dump(obj, file, protocol=None, *, fix_imports=True),最重要的是前两个参数,该方法将obj对象序列化为字节(bytes)输出到file文件中。
pickle.dumps(obj, proto

  • 4
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值