Javascript JSON安全最佳实践?

Javascript JSON安全最佳实践?,javascript,ajax,security,json,Javascript,Ajax,Security,Json,在研究这个问题的时候,我遇到了。现在,选择JSON的原因之一是Javascript易于转换,即使用eval()。现在,从安全的角度来看,这立即让我感到有潜在的问题 因此,我开始研究JSON的安全性,并在这篇博文中介绍如何使用JSON。这部分很突出: 更新:如果您正在执行JSON 100% 正确地说,那么你只有 位于顶层的对象。阵列, 字符串、数字等都将被删除 包裹。然后,JSON对象将失败 由于JavaScript 翻译会认为它在看 一块而不是一个物体。这 这对预防疾病有很大的帮助 然而,这些攻

在研究这个问题的时候,我遇到了。现在,选择JSON的原因之一是Javascript易于转换,即使用
eval()
。现在,从安全的角度来看,这立即让我感到有潜在的问题

因此,我开始研究JSON的安全性,并在这篇博文中介绍如何使用JSON。这部分很突出:

更新:如果您正在执行JSON 100% 正确地说,那么你只有 位于顶层的对象。阵列, 字符串、数字等都将被删除 包裹。然后,JSON对象将失败 由于JavaScript 翻译会认为它在看 一块而不是一个物体。这 这对预防疾病有很大的帮助 然而,这些攻击仍然是最好的 使用 不可预测的URL

好的,这是一条很好的规则:顶层的JSON对象应该始终是对象,而不是数组、数字或字符串。对我来说这是个好规则

谈到JSON和AJAX相关的安全性,还有什么需要做或避免的吗

上面引用的最后一部分提到了不可预测的URL。有没有人对此有更多的信息,特别是您是如何在PHP中实现的?我在Java方面的经验比PHP丰富得多,在Java中很容易(因为可以将整个URL映射到单个servlet),而我所做的所有PHP都将单个URL映射到PHP脚本

另外,如何准确地使用不可预测的URL来提高安全性

使用不可预测的URL保护您的安全数据仍然是最好的

我的。真是胡说八道!最好通过适当的身份验证和可能的加密来保护您的安全数据。JSON交换仍然可以使用现有的身份验证技术(例如通过cookie的会话)和SSL

当您使用JSON将数据导出到匿名第三方(例如web服务)时,依靠没有猜到URL(他们实际上在谈论什么)的人将是一种合理的技术(即使是这样,也只是这样)。一个例子是谷歌的各种web服务API,匿名用户通过其他网站访问谷歌数据。他们使用域引用器和API键来确保中间人网站可以提供Gooogle数据

如果您只是使用JSON向直接的已知用户代理发送私有数据,或者从该代理发送私有数据,请使用一些真正的身份验证和加密。如果您试图提供Web服务,那么这实际上取决于数据的“安全”程度。如果它只是公共数据,而你不介意谁可以阅读它,我不认为创建一个散列URL有什么意义


编辑:为了证明他们的意思,考虑一下这个。假设您的银行提供了一个JSON API来获取对账单。如果我能键入
http://yourbank.com/json-api/your-name/statement
,您可能不会很高兴

他们可以为您的帐户生成任何JSON请求所需的唯一字符串,例如:
http://yourbank.com/json-api/your-name/big-long-key-unique-to-you/statement


我猜得到的可能性要小得多。但是,您真的希望它成为您真正安全的数据和潜在身份盗贼之间的唯一缓冲区吗?否。

博客的主要安全漏洞(CSRF)不是JSON特有的。相反,使用XML也是一个很大的漏洞。事实上,没有异步调用也同样糟糕;常规链接同样容易受到攻击

当人们谈论独特的URL时,他们通常不是指。相反,更常见的做法是使请求的其他内容具有唯一性;即表单post中的值或URL参数

通常,这涉及在服务器端的表单中插入一个随机令牌,然后在发出请求时进行检查

数组/对象对我来说是新闻:

脚本标记:攻击者可以嵌入 指向远程服务器的脚本标记 浏览器将有效地 eval()为您提供答复,但是 扔掉回应,然后 JSON是所有响应,您是安全的


在这种情况下,您的站点根本不需要使用JSON就可以受到攻击。但是,是的,如果攻击者可以将随机HTML插入您的站点,那么您就完蛋了。

有许多针对JSON的安全攻击,尤其是XSRF

当web服务使用Cookie进行身份验证,并在响应GET请求时使用包含敏感数据的JSON数组进行响应时,就会出现此漏洞

如果攻击者可以诱骗登录服务naive-webapp.com的用户访问其网站(或嵌入其控制的IFRAME的任何网站,例如通过嵌入式广告),则他们可以在naive-webapp.com中插入带有SRC的
标记,并可能窃取用户的数据。 这取决于javascript
Array
构造函数的javascript特性,如下所示:

 <script>
   // Overload the Array constructor so we can intercept data
   var stolenArrays = [];
   var RealArray = Array;
   Array = function () {
     var arr = RealArray.apply(arguments);
     stolenArrays.push(arr);
     return arr;
   }
 </script>
 <!-- even though the attacker can't access the cookies,
   - he can cause the browser to send them to naive-webapp.com -->
 <script src="//naive-webapp.com/..."></script>
 <script>
   // now stolenArrays contains any data from the parsed JSON
 </script>
应用程序将输入(参数“in”,其中包含win.ini文件)嵌入到web服务响应中


我一点也不明白!当然,浏览器发出的任何请求(对任何URL-不可预测或不可预测)都可以报告给用户,可以使用控制台或一些花哨的GM脚本……“JSON没有人们想象的那么安全”是致命的。我想你需要阅读博客的其余部分:除了不可预测的URL,他不主张任何安全。他说,通过cookies实现安全性是不够的,他解释了原因。身份验证没有帮助——这是问题的关键。例如,如果用户登录到target.com(即,他们有一个会话cookie),如果顶级元素是数组,则攻击者.com可能会尝试类似于
的操作,并使用Mike描述的数组构造函数技巧获取数据。有两个问题--将身份验证与授权混淆,然后你错误地假设pas
<!DOCTYPE root 
[
<!ENTITY foo SYSTEM "file:///c:/winnt/win.ini">
]>
...
<in>&foo;</in>