9

我正在通过一些 scipy 讲座(http://scipy-lectures.github.io/intro/language/standard_library.html#pickle-easy-persistence),我遇到了关于 Pickle 的声明:

Useful to store arbitrary objects to a file. Not safe or fast!

他们这是什么意思?不安全(根据 Pickle 文档),因为不要 UnPickle 来自未知来源的文件,或者不安全,因为您并不总是检索原始对象?

什么是更安全和更快的替代方案?我知道 cPickle 更快,但我认为它不能解决上述更安全的定义。

谢谢。

4

2 回答 2

8

在生产代码中使用 pickle 在设计上很容易受到攻击。unpickling可以执行任意代码。您可以安全地仅从受信任的来源中提取数据。永远不要取消从不受信任或未经身份验证的来源收到的数据。

有关实际应用示例,请参见此处

至于更快的替代方案,有marshal,python内部serealization 库。但与 pickle(或 cPickle,它只是一个 C 实现)不同,它不太稳定(请参阅docs)并且它的输出是架构和操作系统独立,取决于 python 版本。在 Windows 平台上使用 python 2.7.5 编组的对象保证在 OS X 或安装了 python 2.7.5 的 Ubuntu 上是不可编组的,但不能保证在 Windows 上使用 python 2.6 是不可编组的。

另一个更快、更安全、但功能更少的序列化替代方案是JSON.

于 2013-10-26T12:52:24.717 回答
0

原始模块 Pickle 几乎从未使用过。

如果您需要快速完成,请使用 cPickle。

如果你需要一个安全的,试试sPickle

于 2014-01-13T22:49:56.727 回答