在JSON和安全性中注入javascript

Injecting javascript in JSON and security

本文关键字:注入 javascript 安全性 JSON      更新时间:2023-09-26

我有一个在线服务,用户可以在其中创建json支持的文档。然后将它们存储在服务器上,其他用户可以加载它们。json随后被完全按照提交的方式进行解码。如果用户在提交json之前对其进行篡改,并注入任意javascript,然后在查看器的浏览器上执行,是否存在安全风险?这可能吗?这就是我需要知道的,如果这是可能的,或者从json字符串中任意执行javascript是可能的。

这完全取决于a)是否在服务器端清理JSON,以及(甚至更多)b)再次加载JSON时如何在客户端解码JSON。

  • 任何使用eval()将JSON反序列化为Javascript对象的代码都会受到您所描述的攻击。

  • 任何使用JSONP加载JSON的代码(即将JSON作为Javascript文本传递给命名回调函数)都会受到您所描述的攻击(这实际上与使用eval()相同)。

  • 大多数健壮的JSON解析机制(例如json2.js、jQuery $.parseJSON函数或支持它的浏览器中的原生JSON.parse()函数)都不会接受不遵循JSON规范的JSON。因此,如果您使用库来解析JSON字符串,那么您可能是安全的。

  • 无论您打算如何在客户端加载JSON,在服务器端清除任何用户提交的内容都是一种很好的做法。在这种情况下,您可以使用服务器端代码来检查JSON是否有效(例如,在Python中使用json.loads(user_submitted_json),并捕获错误)。

因此,在服务器端和客户端都要小心的情况下,您应该能够安全地完成这项工作。

<plug shameless="true">

JSON sans-eval旨在避免格式错误的JSON问题,同时仍能有效解析。

此JSON解析器不尝试验证JSON,因此可能会在给定语法无效输入的情况下返回结果,但不使用eval,因此具有确定性,并保证不会修改其返回值以外的任何对象。

JSON.org的JavaScript中有许多JSON解析器。无论何时(当JSON可能来自不受信任的源时),无论何时(无论何时),只要存在安全问题,只要存在速度问题,只要不存在格式错误的JSON,都应使用此实现。

</plug>

JSON传统上是使用eval()语句解析的,这几乎是不安全的。如果您允许这样做,您的应用程序将不安全。