我正在序列化/挑选一个对象,将其编码为压缩字符串,并将其作为参数传递给下一页的URL以进行反序列化。我的网络应用程序没有数据库;我这样做是因为应用程序从外部Web服务获取数据,这很慢。
这是可接受的做法吗?这是安全隐患吗?有没有办法使这个安全?
答案 0 :(得分:1)
如果您需要在视图之间共享数据,请使用会话执行此操作。这就是为什么会议。会话信息默认存储在数据库中,但它没有 ,您也可以使用文件系统,某些缓存系统(memcache,Redis等)或signed-cookies (仅限Django 1.4+)。
请参阅:
答案 1 :(得分:1)
这是安全隐患吗?
如果你使用的序列化是pickle那么肯定是一个问题,正如doc所提到的那样:
永远不要取消从不受信任或未经身份验证的来源收到的数据
使用仅用于保存安全静态值的序列化形式(例如JSON)。
您可以通过使用MAC签名来保护您发送到客户端的值免遭篡改,例如使用hmac。您可能需要考虑向MAC签名数据添加其他属性,例如用户名或时间戳,以防止签名数据块可自由替换,如果这对您要实现的任何完整性构成威胁。
如果您还需要保护值不被客户端用户查看和解释,除了签名之外,您还需要使用加密算法(例如AES - 不是stdlib的一部分)。
(我仍然不会相信MAC签名和加密的pickle。即使它需要泄露服务器端的秘密以使其可被利用,你真的不希望信息泄漏漏洞升级一个任意代码执行漏洞,这是pickle所代表的。)
答案 2 :(得分:0)
这不是最佳选择,因为URL参数字段将显示在服务器日志中。你是 可能更好用POST方法或更好的方式发送数据,创建一个基本的数据库(如果你没有其他任何东西,使用Sqlite),只需将ID传递到下一个屏幕。