python - 为什么对 python 服务器使用 struct 而不是 pickle
问题描述
我不明白为什么我应该使用struct
python 服务器而不是pickle
struct
- 更难使用,不能转换 python 对象,只能发送数字或布尔值pickle
- 易于使用,我可以将对象本身转换为字节,因此在客户端也很容易(我的意思是我可以转换dict
为字节并将其发送给客户端)
解决方案
你永远不应该接受来自远程连接的 Pickle,至少在没有严格检查数据是否可信的情况下是这样。正如[文档]所述:
警告:该
pickle
模块对错误或恶意构建的数据不安全。永远不要取消从不受信任或未经身份验证的来源收到的数据。
pickle 数据流是一种简单的堆栈语言,可用于创建和执行任意 Python 代码。您无法在接收端防范这种情况。如果攻击者极有可能将他们选择的 pickle 数据发送到您的服务器,那么您的进程就会受到威胁。黑客可以发送os.execv('rm -rf /')
或编组代码对象来设置一个简单的套接字服务器,等待进一步的命令。
struct
可能更难使用,但它只允许特定的数据类型,并且这些都是标准化的。这将使用其他编程语言编写客户端变得更加容易。
还有更多的替代品没有泡菜的缺点,而且更容易使用。您可以考虑无模式但标准化的格式,例如JSON(更详细,因为它是一种文本格式,但压缩会有所帮助)和BSON(二进制 JSON)或使用诸如协议缓冲区之类的东西来处理您的协议数据序列化。
推荐阅读
- javascript - JS通过多个参数过滤
- javascript - 使用 JavaScript 计算时差时出现问题
- laravel - 有没有办法使用 Passport 生成用户身份验证所需的所有路由?
- powershell - 无法将类型“X”的“X”值转换为类型“X”
- python - 当属性名称使用类型匹配类名称时,为什么会引发 TypeError?
- react-native - 如何在博览会 BarCodeScanner 中删除多余的空白
- python - 如何根据列中具有相同值的行对行进行分组,然后在每个子集上运行我的代码?
- asp.net-mvc - 如何将数据库表中的列放入动态列表中?
- android - Flutter - 当用户移动到其他(预览)屏幕时如何正确暂停相机?
- mysql - 如何在mysql中使用radious通过lat long获得最近的地方