与发送 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 发送大量消息相比,发送大量消息是不是有很多开销?