从服务器向客户端发送 JSON 格式的 HTML 时,我应该转义内容吗?

Posted

技术标签:

【中文标题】从服务器向客户端发送 JSON 格式的 HTML 时,我应该转义内容吗?【英文标题】:Should I escape content when sending HTML in JSON from server to client? 【发布时间】:2013-09-08 23:35:09 【问题描述】:

我需要将 html 内容从服务器发送到客户端以显示它们(用户可以以 HTML 格式发布 cmets,其他人可以查看这些 cmets)。我的客户端是丰富的 JS 应用程序,它通过 JSON API 与服务器通信。

我的问题是如果我返回这样的回复:


  commentId: '123',
  authorId: '123',
  comment: 'possible HTML here'

我应该在服务器上的 comment 字段中转义内容并将转义后的内容发送给客户端,还是应该发送原始 HTML 并让客户端在需要时负责转义?什么是常见的做法?

还显示该 HTML 我应该以某种方式对其进行清理(例如删除脚本标签等)吗?

【问题讨论】:

我只是将 HTML 字符串按原样发送到服务器并在那里处理它。如果你不做前端模板,就没有理由在 IMO 那里做。 【参考方案1】:

没有常见的做法,例如,如果用户提交一些带有脚本标签的 HTML,您可以在使用 http://htmlpurifier.org/ 库对其进行清理后将所有内容保存在数据库中,它允许您指定要删除的标签保留哪些...

或者您可以按原样保存提交的 HTML,并在客户端使用例如 https://code.google.com/p/google-caja/wiki/JsHtmlSanitizer (https://code.google.com/p/google-caja/source/browse/trunk/src/com/google/caja/plugin/html-sanitizer.js?r=5170) 对其进行清理,这与 HTMLPurifier 几乎相同,但在客户端

清理 HTML 是 cpu 密集型任务,所以在第一种情况下,您将使用服务器的 cpu,在第二种情况下,您将使用用户的

你选择

【讨论】:

【参考方案2】:

这里有两个问题。

    我应该[手动]转义 JSON 字符串吗? 我应该在其中转义 HTML 吗?

对于第一个问题,答案是否定的。您必须使用任何工具从您的语言提供的数据结构中创建 JSON 字符串。

对于第二个问题 - 这取决于。如果您的用户确实允许发布 HTML cmets,并且您已经验证了它们 - 显然您不必转义此 HTML。

【讨论】:

【参考方案3】:

我认为你应该逃避它。否则它将不是有效的 JSON,您将在前端遇到问题。我建议在客户端使用https://github.com/douglascrockford/JSON-js,并在您的后端使用它的一些替代方案。 JSON.parse 和 JSON.stringify 将保证您传递有效的数据。

【讨论】:

【参考方案4】:

您应该转义 JSON 内容。

我建议在以 JSON 格式发送它之前对其进行转义,因为它使 JSON 在此过程中更加健壮。

例如,格式可以在 " 和特殊字符上中断(这两种情况都会破坏我的 JSON 对象,从而导致网站损坏!)。

【讨论】:

以上是关于从服务器向客户端发送 JSON 格式的 HTML 时,我应该转义内容吗?的主要内容,如果未能解决你的问题,请参考以下文章

本地html向远程的服务器发送aJax请求的问题

将客户端 Json 下载为 CSV

如何从 Java 对象向客户端发送 spring 消息

uniapp发送请求服务器接收不到数据的问题

Working With JSON

如何检查从服务器收到的响应是 html 还是 json 并在 extjs 中按名称查找 html 表单?