与发送 JSON 和构建 HTML 相比,在 AJAX 中发送 HTML 有多危险? [复制]

Posted

技术标签:

【中文标题】与发送 JSON 和构建 HTML 相比,在 AJAX 中发送 HTML 有多危险? [复制]【英文标题】:How dangerous is it send HTML in AJAX as opposed to sending JSON and building the HTML? [duplicate] 【发布时间】:2010-09-30 13:12:13 【问题描述】:

可能重复:Why is it a bad practice to return generated html instead of JSON? Or is it?

在我看来,任何对此的拦截都可能立即带来麻烦,因为任何人都可以将任何 HTML/脚本发送回客户端。

我对此感兴趣的唯一原因是,每次 DOM 结构/CSS 发生变化时,前端开发人员都会感到巨大的痛苦,因此您现在必须弄清楚 javascript HTML 构建过程的位置您可能需要更新。

你们是怎么处理这个问题的?我可以做些什么来降低任何风险,或者这只是个坏主意?

【问题讨论】:

【参考方案1】:

在我看来,当 DOM 结构或 CSS 发生更改时,要弄清楚后端服务器中需要更改的位置会更加麻烦。

将所有内容保存在一个位置(HTML 文件)可能是将 ajax 通信限制为 JSON 的最佳理由。

【讨论】:

不是真的在 Rails 中。充分利用局部变量会使这个可以忽略不计。【参考方案2】:

对于 JSON 原始 html,您仍然担心内容的安全性,毕竟 JSON 是 JavaScript 代码。我想如果你不信任你的 HTML 数据的来源,那么你就会对各种跨站点脚本攻击持开放态度。考虑以 JSON 格式发送数据并使用 Javascript 模板库,如 Yahoo UI 库中的模板库,请参阅http://developer.yahoo.com/yui/docs/YAHOO.lang.html#method_substitute 然后让前端人员维护模板。

【讨论】:

好吧,不,如果您使用专用的 JSON 解析器而不是 juat "eval",则不会。 “eval”使损坏的 JSON 可能不安全,而不是 JSON 本身。 HTML 也是如此。在您将其设置为“innerHtml”之前,它不是 HTML。如果你把它当作 XML,并适当地处理它,它会更安全。【参考方案3】:

我倾向于使用以下规则:

    请求并返回 HTML 以进行快速 sn-ps,然后使用客户端(静态)Javascript 插入它们。非常适合警报消息。

    为大型数据集请求并返回 JSON。当您想在客户端进行过滤、分组或排序而不以不同的形式重新请求数据时,这非常有用。

    为大型数据集请求并返回 JSON,但在 JSON 记录中包含(转义的)HTML sn-p。这意味着比(2)更多的渲染时间和更多的带宽使用,但可以减少通常复杂的 HTML 渲染的重复。

    请求并返回 Javascript,以及 eval 客户端。这最适用于隐藏、显示、移动和删除等交互。它也适用于插入,但通常键入 (1) 或 (5) 更适合。

    请求并返回 Javascript,eval 它是客户端,但在 Javascript 中包含转义的 HTML,以便服务器进行 HTML 呈现。

我可能最常使用 5 和 1。

【讨论】:

只是为了澄清#5:在客户端有 eval,而在服务器上你正在生成 html,转义它,并将它嵌入到可执行的 javascript 中,对吗?你觉得可以维护吗? 我确实发现它可以在像 Rails 这样的 MVC 环境中维护。我已经为 HTML 视图生成了 HTML 部分,所以我只需要将它们嵌入到 JS 中。【参考方案4】:

我不确定我是否 100% 理解这个问题......但是......

我们使用 GWT 并在客户端和服务器之间发送 XML。我已经使用 GWT 代码生成器实现了一个 XML 映射系统,因此在 XML 和 JavaScript 对象之间转换的代码是根据对象本身自动生成的(使用 java 类中的注释)。

直接发送 HTML 只会降低您的应用程序的能力,因为它不再能够以任何方式解释数据,而只是用它来更新屏幕。这也使现在需要生成 HTML 的服务器端变得复杂......我会认真避免这种策略。

【讨论】:

【参考方案5】:

我在 javascript 方面有一种 /task/action/parameter 成语。 我的后端严格返回我需要的 JSON 数据,客户端 (js) 负责显示它。假设我加载了这个页面/#/item/product/5,javascript 知道它必须调用“item”对象,方法“product”并传入参数 5。

这对于为链接添加书签非常有效,因此当有人决定在每次加载该页面时为 mysite.com/#/item/product/5 添加书签时,它就知道要调用什么对象..方法。

【讨论】:

【参考方案6】:

我认为在安全性方面没有太大区别 - 您可以解析不安全的 JSON 以及不安全的 HTML/JS。

更多的是关于应用程序的正确分层 - 如果您直接将 HTML 注入页面,则必须在业务逻辑级别创建特定于视图的代码,在我的印象中,这对干净且易于交换的层没有好处。

只要我的 2 美分……

【讨论】:

【参考方案7】:

我对此感兴趣的唯一原因是,每次 DOM 结构/CSS 发生变化时,前端开发人员都会感到巨大的痛苦,因此您现在必须弄清楚 Javascript HTML 构建过程的位置您可能需要更新。

你一定做错了。

从 AJAX 返回的数据应该只是语义数据,即只要布局改变就不会改变的东西。将数据转换为 DOM 操作最好留给母版页本身中定义的 Javascript 函数。

【讨论】:

【参考方案8】:

我将其作为评论发表,但我正在推动它。

JSON 本质上是安全的,问题在于人们如何使用它。

使用 eval 评估它是问题所在,而不是格式,因为格式受到 JSON 规范的隐式限制。损坏的 JSON 会使 eval 不安全。所以……不要那样做。不要使用 eval,使用专用的 JSON 解析器。

同样的逻辑可以应用于 HTML。将 HTML 视为“数据”,将其视为简单的 XML,并对其进行处理,而不是盲目地将其添加到您的页面中。

恶作剧更难通过这种方式。

【讨论】:

以上是关于与发送 JSON 和构建 HTML 相比,在 AJAX 中发送 HTML 有多危险? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

与 javascript 日期相比,Json Stringify 日期产生错误的日​​期

与使用 WebSockets 发送大量消息相比,发送大量消息是不是有很多开销?

与 JSF 相比,React 如何具有更好的性能

部分视图与 Json(或两者)

多叉树结合JavaScript树形组件实现无限级树形结构(一种构建多级有序树形结构JSON(或XML)数据源的方法)

如何将Javascript数组作为Json与html表单结合发送?