1

我正在序列化/腌制一个对象,将其编码为压缩字符串,并将其作为 URL 中的参数传递给下一页以进行反序列化。我的网络应用没有数据库;我这样做是因为该应用程序从外部 Web 服务获取数据,这些服务速度很慢。

这是可接受的做法吗?这是安全风险吗?有没有办法让这个安全?

4

3 回答 3

1

如果您需要在视图之间共享数据,请使用会话进行。这就是会话的目的。会话信息默认存储在数据库中,但并非必须如此,您也可以使用文件系统、一些缓存系统(memcache、Redis 等)或签名 cookie(仅限 Django 1.4+)。

看:

于 2012-06-25T19:51:04.570 回答
1

这是安全风险吗?

如果您使用的序列化是pickle,那么是的,这绝对是一个问题,正如文档中提到的那样:

永远不要解开从不受信任或未经身份验证的来源收到的数据

使用一种仅用于保存安全静态值的序列化形式(例如 JSON)。

您可以通过使用 MAC 签名来保护发送到客户端的值不被篡改,例如使用hmac。您可能需要考虑向 MAC 签名数据添加其他属性,例如用户名或时间戳,以防止签名数据块可以自由互换,如果这对您试图实现的任何完整性构成威胁。

如果您还需要保护该值不被客户端用户查看和解释,除了签名之外,您还需要使用加密算法(例如 AES - 不是 stdlib 的一部分)。

(我个人仍然不会相信 MAC 签名和加密的 pickle。即使它需要泄露服务器端的秘密才能使其可利用,但您并不真的希望信息泄露漏洞升级为任意-代码执行漏洞,这就是pickle所代表的。)

于 2012-06-25T22:04:38.523 回答
0

这不是最佳选择,因为 URL 参数字段将显示在服务器日志中。您可能最好使用 POST 方法发送数据,或者更好的是,创建一个基本数据库(如果您无权访问其他任何内容,请使用 Sqlite)并将 ID 传递到下一个屏幕。

于 2012-06-25T19:28:45.677 回答