在JSON对象中存储和发送原始文件数据

rel*_*lic 5 javascript ajax json xmlhttprequest backbone.js

我正在寻找一种方法来传输任何文件类型的原始文件数据与任何可能的内容(我的意思是文件和文件内容都是用户生成的)两种方式在Backbone前端使用xhr/ajax调用对抗Django后端.


编辑:也许这个问题还不清楚......

如果在IDE(例如Sublime)中打开文件,则可以查看和编辑包含该文件的实际代码.我试图把THAT原始内容为JSON这样我就可以发送到浏览器,它可以被修改,然后发回.

我发布了这个问题,因为我的印象是因为这些文件的内容可以有效地使用任何编码语言,只是对内容进行字符串化并发送它似乎是一个易于破解或利用的脆弱解决方案.内容可以包含任意数量的',",{}这似乎打破JSON格式字符,并逃避这些字符将离开代码中的文物,将有效地打破他们(不是吗?).

如果这个假设是错误的,那也是一个可以接受的答案(只要你能指出我忽略的是什么).


我正在开发的项目是一个基于浏览器的IDE,它将从服务器接收完整的文件结构.用户可以添加/删除文件,编辑这些文件的内容,然后将其更改保存回服务器.发送/接收都必须通过ajax/xhr调用来处理.

  • 在Backbone中,每个"文件"都被实例化为模型并存储在Collection中.该文件的内容将作为属性存储在模型上.
  • 理想情况下,文件内容在更改时仍会可靠地抛出所有适当的事件.
  • 不应将提取内容分解为与文件模型其余部分的单独调用.我想使用单个save/fetch调用来发送/接收包括原始内容的文件.

需要Underscore/jQuery的解决方案很好,如果有专门用于管理原始文件数据的东西,我可以引入额外的库.

jv-*_*v-k 6

有趣的问题。实现这一点所需的代码会很复杂,抱歉我没有提供示例,但您看起来是一个不错的程序员,应该能够实现下面提到的内容。

关于通过 JSON 发送原始数据,要使其成为 JSON 安全且不破坏代码,您需要做的就是通过使用 Python 的 json.dumps 和 JavaScript 的 JSON.stringyfy 进行 stringyfying 来转义特殊字符。[1]

如果您担心某种形式的基本防篡改,那么除了让客户端和服务器通过 JSON 传输来回传递每个会话令牌以确保 JSON 是不是从恶意地址伪造的。

如果您想检查数据的端到端完整性,请生成一个 md5 校验和并将其发送到您的 JSON 中,然后在到达时生成另一个 md5 并与您的 JSON 中的进行比较。

Base64编码:您的数据大小将增加 33%,因为它编码四个字符来表示三个字节的数据。

Base85:将四个字节编码为五个字符,将使您的数据增加 25%,但比 Python 中的 Base64 使用更多的处理开销。这是数据大小的 8% 改进,但以处理开销为代价。此外,它不是字符串安全的,因为双引号和单引号、尖括号和与号不能在 JSON 中不转义地使用,因为它使用了所有 95 个可打印的 ASCII 字符。需要在 JSON 传输之前进行字符串化。[2]

yEnc 的开销低至 2-3%(取决于数据中相同字节的频率),但被不切实际的缺陷排除在外(参见 [3])。

ZeroMQ Base-85,又名Z85。它是 Base85 的字符串安全变体,数据开销为 25%,优于 Base64。不需要将其粘贴到 JSON 中。我强烈推荐这种编码算法。[4] [5] [6]

如果您只发送小文件(比如几 KB),那么二进制到文本转换的开销是可以接受的。对于几 Mb 大的文件,让它们增长 25-33% 可能是不可接受的。在这种情况下,您可以尝试在发送前压缩它们。[7]

您还可以使用 multipart/form-data 将数据发送到服务器,但我看不出这将如何双向工作。

更新

总之,这是我的解决方案的算法:

发送数据

  • 生成会话令牌并在登录时为关联用户存储(服务器),或从会话 cookie(客户端)中检索

  • 为数据生成 MD5 哈希值,以便在传输过程中进行完整性检查。

  • 使用 Z85 对原始数据进行编码以添加一些基本的防篡改和 JSON 友好性。

  • 将上述内容放在 JSON 中,并在请求时发送 POST。

接待

  • 从 POST 中获取 JSON

  • 从关联用户(服务器)的存储中检索会话令牌,或从会话 cookie(客户端)中检索。

  • 为接收到的数据生成 MD5 哈希值并针对接收到的 JSON 中的 MD5 进行测试,有条件地拒绝或接受。

  • Z85 解码接收到的 JSON 中的数据以获取原始数据并根据需要存储在文件或 DB(服务器)中或在 GUI/IDE(客户端)中处理/显示。


参考

[1]构建JSON字符串时如何转义特殊字符?

[2] JSON 字符串中的二进制数据。比 Base64 更好的东西

[3] https://en.wikipedia.org/wiki/YEnc

[4] http://rfc.zeromq.org/spec:32

[5] C/C++ 中的 Z85 实现https://github.com/artemkin/z85

[6] https://gist.github.com/minrk/6357188​​的Z85 Python实现

[7] JavaScript zip 库http://stuk.github.io/jszip/

[8] JavaScript Gzip SO Gzip 的JavaScript 实现

  • 很好的答案,只是请不要将 MD5 用于任何事情。如果只是针对随机错误进行完整性检查,还有更高效的校验和算法,这些算法也可能支持纠错。如果需要抗碰撞性,则 MD5 被破坏,需要 SHA256 或类似强度的东西。MD5 基本上从来都不是答案。 (2认同)

Nel*_*ira 5

AFAI 担心简单的 Base64 转换就可以做到这一点。Stringify,转换为base64,然后将其传递到服务器并在那里解码。这样您就不会进行原始文件传输,并且仍然可以保持代码简单。

我知道这个解决方案可能看起来有点太简单,但想一想:只要有合适的硬件,许多加密算法就可以被破解。最安全的方法之一是通过数字证书,然后使用私钥加密数据,然后将其发送到服务器。但是,要达到这种安全级别,应用程序的每个用户都必须拥有数字证书,我认为这对您的用户来说是一个过高的要求。

因此,问问自己,如果实施真正安全的解决方案会给用户带来很多麻烦,为什么还需要安全传输?基于此,我重申我之前所说的话。一个简单的 Base64 转换就可以了。您还可以使用其他一些算法,例如 SHA256 或其他算法,以使其更加安全。

  • “安全”绝对比可靠性和速度更重要。这些文件中不应包含任何个人信息,并且已经采取了遏制措施来限制恶意代码的影响。 (2认同)

归档时间:

查看次数:

5076 次

最近记录:

10 年,2 月 前