【问题标题】:why use struct and not pickle for python servers为什么对 python 服务器使用 struct 而不是 pickle
【发布时间】:2018-07-29 13:06:39
【问题描述】:

我不明白为什么我应该将struct 用于python 服务器而不是pickle

  • struct-更难使用,无法转换python对象,只能发送数字或布尔值
  • pickle-易于使用,我可以将对象本身转换为字节,因此在客户端也很容易(我的意思是我可以将 dict 转换为字节并将其发送到客户端)

【问题讨论】:

标签: python sockets struct serversocket asyncsocket


【解决方案1】:

您应该从不接受来自远程连接的 Pickle,至少在没有严格检查数据是否可信的情况下是这样。正如[文档]所述:

警告pickle 模块对错误或恶意构造的数据不安全。永远不要取消从不受信任或未经身份验证的来源收到的数据。

pickle 数据流是一种简单的堆栈语言,可用于创建和执行任意 Python 代码。您无法在接收端防范这种情况。如果攻击者极有可能将他们选择的 pickle 数据发送到您的服务器,那么您的进程就会受到威胁。黑客可以发送os.execv('rm -rf /') 或编组代码对象来设置simple socket server 等待进一步的命令。

struct 可能更难使用,但它只允许specific data types,并且这些是标准化的。这将使用其他编程语言编写客户端变得更加容易。

还有更多替代品没有泡菜的缺点,并且更易于使用。您可以考虑无模式但标准化的格式,例如JSON(更详细,因为它是一种文本格式,但压缩会有所帮助)和BSON(二进制JSON)或使用protocol buffers之类的东西来处理您的协议数据序列化。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-01-06
    • 1970-01-01
    • 2023-03-29
    • 1970-01-01
    • 1970-01-01
    • 2018-02-09
    • 2013-01-04
    • 1970-01-01
    相关资源
    最近更新 更多