当前位置: 首页 > 知识库问答 >
问题:

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

云季萌
2023-03-14

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

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

如果在IDE中打开一个文件(如Sublime),则可以查看和编辑组成该文件的实际代码。我试图将原始内容放入JSON中,这样我就可以发送到浏览器,修改后再发送回去。

我发布这个问题是因为我的印象是,因为这些文件的内容可以有效地使用任何编码语言,只要将内容字符串化并发送出去,这似乎是一个脆弱的解决方案,很容易被破坏或利用。内容可以包含任意数量的'{}字符,这些字符似乎会破坏JSON格式,而转义这些字符会在代码中留下有效破坏它们的工件(不是吗?)。

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

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

  • 在主干网中,每个“文件”被实例化为一个模型并存储在一个集合中。文件的内容将作为属性存储在模型上
  • 理想情况下,在进行更改时,文件内容仍然会可靠地抛出所有适当的事件
  • 获取内容不应被分解为与文件模型其余部分分开的单独调用。我只想使用一个save/fetch调用来发送/接收包含原始内容的文件

需要下划线/jQuery的解决方案很好,如果有专门管理原始文件数据的工具,我可以引入其他库。

共有3个答案

朱承载
2023-03-14

如果这里唯一担心的是代码文件的原始内容(您的模型正在存储的“数据”),将在存储在JSON中时导致某种类型的问题,这很容易通过转义数据来获得。

字符串化原始代码文件内容可能会导致问题,因为任何类似JavaScript或JSON的内容都将被解析为实际的JSON对象。您的代码文件数据可以而且应该简单地存储为eScaped字符串。您在这里担心的是,所述字符串可能包含存储在字符串内的JavaScript中可能会中断的字符,通过转义整个字符串,从而转义代码文件中已转义的任何内容,可以缓解这种情况。

本质上,重要的是要记住,当存储在数据库中时,文件中的原始代码只不过是一个美化的字符串,除非您动态地添加行内元数据。它只是文本,执行标准转义将确保以任何格式存储在JSON中的字符串(在“或”内)是安全的。

我建议阅读这个SO答案,因为我也引用了它来验证我认为是正确的:如何使用JavaScript转义包含换行符的JSON字符串

扈俊健
2023-03-14

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

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

所以问问你自己,如果实现一个真正安全的解决方案会给你的用户带来很多麻烦,为什么你需要一个安全的传输呢?基于此,我重申我以前说过的话。简单的Base64转换即可。你也可以使用一些其他的算法,比如SHA256,让它更安全一些。

苗阳文
2023-03-14

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

关于通过JSON发送原始数据,你所需要做的就是使用Python的json.dumps

如果您担心某种形式的基本防篡改,那么数据的轻编码将符合目的,此外,还可以让客户机和服务器通过JSON传输来回传递每个会话令牌,以确保JSON不会从恶意地址伪造。

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

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

Base85:将四个字节编码为五个字符,将使数据增长25%,但使用的处理开销比Python中的Base64多得多。数据大小提高了8%,但以处理开销为代价。此外,它也不是字符串安全的双重

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

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

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

您也可以使用多部分/表单数据向服务器发送数据,但我看不出这将如何双向工作。

使现代化

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

发送数据

>

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

    为数据生成MD5哈希,以便在传输期间进行完整性检查。

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

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

    接待

    >

  • 从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]Z85在C/Chttps://github.com/artemkin/z85中的实现

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

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

    [8] JavaScript Gzip因此Gzip的JavaScript实现

  •  类似资料:
    • 我想将 JSON 存储在卡桑德拉数据库中。JSON 的每个字段都应映射到其各自的列。 可能吗?如果可能的话,我如何才能实现它?。 请帮帮我..

    • 问题内容: 我想以JSON对象的形式将消息发送到服务器,并解析来自服务器的JSON响应。 JSON对象的示例 我试图通过逐个属性手动解析JSON。我可以使用任何库/实用程序来简化此过程吗? 问题答案: 我很惊讶这些没有被提及:但是,与使用json.org的小程序包进行简单的手工操作相比,GSon和Jackson更为方便。所以: GSON 杰克逊 因此,您实际上可以绑定到自己的POJO,而不是绑定到

    • 我试图发送原始电子邮件与图像作为附件存储在s3使用我试图发送原始电子邮件与图像作为附件存储在s3使用java。然而,当接收电子邮件时图像被损坏。我尝试使用存储在磁盘中的文件,它正常工作,但它不适用于存储在S3中的文件。这是我使用的代码。 请帮帮我,我被困在这里好长一段时间了。

    • 问题内容: 如何在SQLite数据库中存储JSON对象?正确的方法是什么? 一个地方是Blob类型列。如果我可以将JSON对象转换为字节数组并使用Fileoutputstream 另一个想法是将文本列存储为字符串 问题答案: 将JSONObject转换为String并另存为TEXT / VARCHAR。 在检索同一列时,将String转换为JSONObject。 例如 写入数据库 从数据库读取

    • 问题内容: 我不知道这是否可能,但是可以。使用回调使工作变得更加困难。 我有一个包含html文件的目录,我想使用node.js和socket.io将它们以对象块的形式发送回客户端。 我所有的文件都在/ tmpl中 因此,套接字需要读取/ tmpl中的所有文件。 对于每个文件,必须将数据存储在对象中,文件名作为键,内容作为值。 最后的回调也是错误的。目录中的所有文件完成后,必须调用它。 但是我不知道

    • 我使用RedisCacheManager在我的Spring启动应用程序中存储我的缓存数据。默认序列化程序似乎将所有内容序列化为字节,并从字节反序列化为适当的java类型。 但是,我想将缓存数据存储为json,这样我就可以从non-java客户端读取它。 我发现,从默认的序列化程序切换到其他序列化程序(如Jackson2JsonRedisSerializer)应该可以工作。执行此操作后,反序列化阶段