JSON安全最佳实践?

cle*_*tus 73 javascript security ajax json

在研究JSON与XML的问题时,我遇到了这个问题.现在,偏好JSON的原因之一被列为Javascript中的转换易用性,即使用eval().从安全角度来看,这立刻让我感到有些问题.

所以我开始对JSON的安全方面进行一些研究,并在博客文章中讨论JSON如何不像人们想象的那样安全.这部分突出:

更新:如果您正确地执行JSON 100%,那么您将只有顶级对象.数组,字符串,数字等都将被包装.然后,JSON对象将无法使用eval(),因为JavaScript解释器会认为它正在查看块而不是对象.这对于防止这些攻击有很长的路要走,但最好用不可预测的URL来保护您的安全数据.

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

在涉及JSON和AJAX相关的安全性时还有什么可做的或避免的吗?

上面引用的最后一部分提到了不可预测的URL.有没有人有更多的信息,特别是你如何在PHP中做到这一点?我在Java方面比PHP更有经验,在Java中它很容易(因为你可以将一系列URL映射到单个servlet),而我所做的所有PHP都已经将一个URL映射到PHP脚本.

另外,您如何使用不可预测的URL来提高安全性?

Mik*_*uel 53

针对JSON的攻击有很多,特别是XSRF.

当Web服务使用cookie进行身份验证时,会发生此漏洞,并使用包含敏感数据的JSON数组进行响应以响应GET请求.

如果攻击者可以欺骗登录服务的用户naive-webapp.com访问他们的网站(或嵌入他们控制的IFRAME的任何网站,例如通过嵌入式广告),那么他们可以插入<script>带有SRC 的标签naive-webapp.com,并可能窃取用户的数据.这取决于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>
Run Code Online (Sandbox Code Playgroud)

EcmaScript 5修复了导致[]查找Array全局对象的混乱行为,许多现代浏览器不再容易受到这种攻击.

顺便提一下,Oil对于不可预测的URL是错误的.URL中的密码安全随机标识符是保护资源的好方法.基于身份的安全性不是石油所暗示的灵丹妙药.有关安全分布式应用程序方案的示例,请参阅http://waterken.sourceforge.net/,该方案基于URL中的加密安全标识符,不需要身份概念.

编辑:

在考虑JSON与XML时,您也应该了解XML特定的攻击向量.

XXE,XML外部实体攻击,使用精心设计的XML通过防火墙访问文件系统和网络资源.

<!DOCTYPE root 
[
<!ENTITY foo SYSTEM "file:///c:/winnt/win.ini">
]>
...
<in>&foo;</in>
Run Code Online (Sandbox Code Playgroud)

应用程序将输入(参数"in",其中包含win.ini文件)嵌入到Web服务响应中.


Cha*_*ert 18

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

当人们谈论唯一的URL时,他们通常不是指http://yourbank.com/json-api/your-name/big-long-key-unique-to-you/statement.相反,在请求中使用其他独特的东西更为常见; 即FORM帖子中的值或URL参数.

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

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

脚本标签:攻击者可以嵌入一个指向远程服务器的脚本标签,浏览器将有效地为您回复eval(),但是它会丢弃响应,因为JSON都是响应,所以您是安全的.

在这种情况下,您的站点根本不需要使用JSON来容易受到攻击.但是,如果攻击者可以将随机HTML插入您的网站,那么您就是敬酒.