JSON 安全最佳实践?

2024-05-06

在研究这个问题的同时JSON 与 XML http://www.subbu.org/blog/2006/08/json-vs-xml, 我碰到这个问题 https://stackoverflow.com/questions/325085/when-to-prefer-json-over-xml。现在,更喜欢 JSON 的原因之一被列为 Javascript 中易于转换的原因之一,即eval()。现在我立即意识到,从安全角度来看,这可能存在问题。

因此,我开始对 JSON 的安全方面进行一些研究,并通过这篇博文了解如何JSON 并不像人们想象的那么安全 http://incompleteness.me/blog/2007/03/05/json-is-not-as-safe-as-people-think-it-is/。这部分突出了:

Update:如果你 100% 执行 JSON 正确的话,那么你只会有 顶层的对象。数组, 字符串、数字等都将是 包裹。 JSON 对象将会失败 eval() 因为 JavaScript 解释器会认为它正在看 一个块而不是一个对象。这 对预防有很大帮助 这些攻击,但它仍然是最好的 保护您的安全数据 不可预测的 URL。

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

当涉及到 JSON 和 AJAX 相关的安全性时,还有其他需要做或避免的事情吗?

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

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


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

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

如果攻击者可以欺骗登录到服务 naive-webapp.com 的用户访问他们的网站(或任何嵌入他们控制的 IFRAME 的网站,例如通过嵌入式广告),那么他们可以插入<script>使用 SRC 标记到 naive-webapp.com,并可能窃取用户的数据。 这取决于 JavaScript 的 javascript 怪癖Array像这样的构造函数:

 <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>

EcmaScript 5 修复了导致的令人困惑的行为[]去查查看Array在全局对象上,许多现代浏览器不再容易受到这种攻击。

顺便说一句,Oil 关于不可预测的 URL 的说法是错误的。 URL 中的加密安全随机标识符是保护资源的好方法。基于身份的安全并不是石油所暗示的万能药。 看http://waterken.sourceforge.net/ http://waterken.sourceforge.net/例如,基于 URL 中的加密安全标识符的安全分布式应用程序方案,不需要身份概念。

EDIT:

在考虑 JSON 与 XML 时,您还应该了解 XML 特定的攻击媒介。

XXE http://projects.webappsec.org/w/page/13247003/XML%20External%20Entities、XML 外部实体攻击,利用精心设计的 XML 穿过防火墙访问文件系统和网络资源。

<!DOCTYPE root 
[
<!ENTITY foo SYSTEM "file:///c:/winnt/win.ini">
]>
...
<in>&foo;</in>

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JSON 安全最佳实践? 的相关文章