与发送JSON和构建HTML相比,它在AJAX中发送HTML有多危险?

时间:2009-01-09 17:45:19

标签: javascript html ajax security json

  

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

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

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

你们如何处理这件事?我能做些什么来降低风险,或者只是直接的坏主意?

8 个答案:

答案 0 :(得分:10)

我倾向于使用以下规则:

  1. 请求并返回HTML以获取快速代码段,然后使用客户端(静态)Javascript来插入它们。非常适合提醒信息。

  2. 请求并返回大型数据集的JSON。当您想要在客户端进行过滤,分组或排序而无需以其他形式重新请求数据时,这非常有用。

  3. 请求并返回大型数据集的JSON,但包含JSON记录中每条记录的(转义)HTML片段。这意味着比(2)更多的渲染时间和更多的带宽使用,但可以减少复杂的HTML渲染的重复。

  4. 请求并返回Javascript,eval客户端。这最适合隐藏,显示,移动和删除等交互。它也适用于插入,但通常类型(1)或(5)可以更好地工作。

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

  6. 我最常使用5和1。

答案 1 :(得分:1)

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

将所有这些保存在一个地方(HTML文件)可能是将ajax通信限制为JSON的最佳理由。

答案 2 :(得分:0)

使用JSON原始html后,您仍然担心内容是安全的,毕竟JSON是JavaScript代码。我想如果您不相信HTML数据的来源,那么您可以接受各种跨站点脚本攻击。考虑将数据作为JSON发送并使用Javascript Templating库(如Yahoo UI库中的那个),请参阅http://developer.yahoo.com/yui/docs/YAHOO.lang.html#method_substitute 然后让前端人员维护模板。

答案 3 :(得分:0)

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

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

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

答案 4 :(得分:0)

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

这非常适用于为链接添加书签,所以当有人在每次加载页面时决定为mysite.com/#/item/product/5添加书签时,它确切地知道要调用的对象...方法。

答案 5 :(得分:0)

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

更多的是关于你的应用程序的正确分层 - 如果你直接将HTML注入你的页面,你必须在业务逻辑层面创建特定于视图的代码,这对我的印象来说不利于干净且易于交换的层。

只是我的2美分......

答案 6 :(得分:0)

  

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

你一定做错了。

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

答案 7 :(得分:0)

我将此作为评论,但我正在推动它。

JSON本质上是安全的,问题就是人们用它做的事情。

使用eval来评估它是问题,而不是格式,因为格式是由JSON规范隐式限制的。损坏的JSON可能使eval不安全。所以......不要这样做。不要使用eval,请使用专用的JSON解析器。

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

诡计更难以通过这种方式溜走。