我正在序列化/腌制一个对象,将其编码为压缩字符串,并将其作为 URL 中的参数传递给下一页以进行反序列化。我的网络应用没有数据库;我这样做是因为该应用程序从外部 Web 服务获取数据,这些服务速度很慢。
这是可接受的做法吗?这是安全风险吗?有没有办法让这个安全?
我正在序列化/腌制一个对象,将其编码为压缩字符串,并将其作为 URL 中的参数传递给下一页以进行反序列化。我的网络应用没有数据库;我这样做是因为该应用程序从外部 Web 服务获取数据,这些服务速度很慢。
这是可接受的做法吗?这是安全风险吗?有没有办法让这个安全?
这是安全风险吗?
如果您使用的序列化是pickle,那么是的,这绝对是一个问题,正如文档中提到的那样:
永远不要解开从不受信任或未经身份验证的来源收到的数据
使用一种仅用于保存安全静态值的序列化形式(例如 JSON)。
您可以通过使用 MAC 签名来保护发送到客户端的值不被篡改,例如使用hmac。您可能需要考虑向 MAC 签名数据添加其他属性,例如用户名或时间戳,以防止签名数据块可以自由互换,如果这对您试图实现的任何完整性构成威胁。
如果您还需要保护该值不被客户端用户查看和解释,除了签名之外,您还需要使用加密算法(例如 AES - 不是 stdlib 的一部分)。
(我个人仍然不会相信 MAC 签名和加密的 pickle。即使它需要泄露服务器端的秘密才能使其可利用,但您并不真的希望信息泄露漏洞升级为任意-代码执行漏洞,这就是pickle所代表的。)
这不是最佳选择,因为 URL 参数字段将显示在服务器日志中。您可能最好使用 POST 方法发送数据,或者更好的是,创建一个基本数据库(如果您无权访问其他任何内容,请使用 Sqlite)并将 ID 传递到下一个屏幕。