2012-06-25 114 views
1

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

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

回答

1

如果您需要在视图之间共享数据,请使用会话进行操作。这是会议的目的。会话信息默认存储在数据库中,但它不具有,您还可以使用文件系统,某些缓存系统(memcache,Redis等)或signed-cookies(仅限Django 1.4+)。

请参见:

0

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

1

这是一个安全隐患?

如果您使用的是序列化是泡菜则是这绝对是一个问题,因为提到的doc:从不受信任的或未经验证的源接收

决不unpickle数据

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

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

如果您还需要保护客户端用户查看和解释的值,则除签名外,您还需要使用加密算法(例如,AES--不是stdlib的一部分)。我仍然不会亲自信任MAC签名和加密的pickle,尽管它需要泄露服务器端的秘密才能被利用,但是您并不是真的想要一个信息泄漏漏洞升级为任意代码执行漏洞,这是pickle代表的。)