为什么 python 服务器使用 struct 而不是 pickle
why use struct and not pickle for python servers
我不明白为什么我应该为 python 服务器使用 struct
而不是 pickle
struct
-更难使用,无法转换 python 对象,只能发送数字或布尔值
pickle
-易于使用,我可以将对象本身转换为字节,因此在客户端也很容易(我的意思是我可以将 dict
转换为字节并发送给客户)
您应该从不接受来自远程连接的 Pickle,至少在没有严格检查数据是否可信的情况下接受。正如 [文档] 所述:
Warning: The pickle
module is not secure against erroneous or maliciously constructed data. Never unpickle data received from an untrusted or unauthenticated source.
pickle 数据流是一种简单的堆栈语言,可用于创建和执行任意 Python 代码。你无法在接收端防范这一点。如果攻击者极有可能将他们选择的 pickle 数据发送到您的服务器,那么您的进程就会受到威胁。黑客可以发送 os.execv('rm -rf /')
或编组代码对象来设置 simple socket server 等待进一步的命令。
struct
可能更难使用,但它只允许 specific data types,并且这些是标准化的。这将使使用其他编程语言编写客户端变得更加容易。
有更多替代方案没有 pickle 的缺点,并且更易于使用。您可以考虑无模式但标准化的格式,例如 JSON (more verbose as it is a textual format, but compression can help), and BSON (Binary JSON) or use something like protocol buffers 来处理您的协议数据序列化。
我不明白为什么我应该为 python 服务器使用 struct
而不是 pickle
struct
-更难使用,无法转换 python 对象,只能发送数字或布尔值pickle
-易于使用,我可以将对象本身转换为字节,因此在客户端也很容易(我的意思是我可以将dict
转换为字节并发送给客户)
您应该从不接受来自远程连接的 Pickle,至少在没有严格检查数据是否可信的情况下接受。正如 [文档] 所述:
Warning: The
pickle
module is not secure against erroneous or maliciously constructed data. Never unpickle data received from an untrusted or unauthenticated source.
pickle 数据流是一种简单的堆栈语言,可用于创建和执行任意 Python 代码。你无法在接收端防范这一点。如果攻击者极有可能将他们选择的 pickle 数据发送到您的服务器,那么您的进程就会受到威胁。黑客可以发送 os.execv('rm -rf /')
或编组代码对象来设置 simple socket server 等待进一步的命令。
struct
可能更难使用,但它只允许 specific data types,并且这些是标准化的。这将使使用其他编程语言编写客户端变得更加容易。
有更多替代方案没有 pickle 的缺点,并且更易于使用。您可以考虑无模式但标准化的格式,例如 JSON (more verbose as it is a textual format, but compression can help), and BSON (Binary JSON) or use something like protocol buffers 来处理您的协议数据序列化。