网络对象序列化与字符串处理技术详解
1. 网络对象序列化概述
在处理网络对象序列化时,从未知或不可信源加载 pickle 对象存在风险。因为可以向 pickle 文件中注入任意代码,通过 pickle 恶意攻击计算机。而且,pickle 只能被其他 Python 程序加载,难以与其他语言编写的服务共享。
多年来,有许多格式用于此目的,常见的有:
| 格式 | 简介 |
| ---- | ---- |
| XML(可扩展标记语言) | 过去很流行,尤其受 Java 开发者青睐 |
| YAML(另一种标记语言) | 偶尔会被提及 |
| CSV(逗号分隔值) | 常用于表格数据交换 |
在使用这些格式的库处理不可信数据时,要研究其安全问题。例如,XML 和 YAML 都有一些隐蔽特性,若被恶意使用,可在主机上执行任意命令,且这些特性默认可能未关闭。
JavaScript 对象表示法(JSON)是一种人类可读的原始数据交换格式,它是一种标准格式,可被多种异构客户端系统解释,非常适合在完全解耦的系统之间传输数据。此外,JSON 不支持可执行代码,只能序列化数据,因此更难注入恶意语句。
1.1 JSON 模块的使用
如果用 Python 编写的 Web 应用要将内部数据转换为 JSON 格式,可使用 json
模块。该模块提供了与 pickle
模块类似的接口,有 dump
、 load
、 dumps
和 loa