在 JSON 中注入 javascript 和安全性

发布于 2024-11-16 16:46:39 字数 197 浏览 1 评论 0原文

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

I have an online service where users can create json-backed documents. These are then stored on a server and other users can load them. The json is then decoded exactly as it was submitted. Are there any security risks in the event that a user tampers with the json before they submit it and injects arbitrary javascript, which is then executed on the viewers' browser? Is this even possible? that's what I need to know, if this is possible, or arbitrary execution of javascript from a json string is possible.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

忘东忘西忘不掉你 2024-11-23 16:46:39

这完全取决于 a) 您是否在服务器端清理 JSON,以及(更多)b) 当您再次加载 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_subscribed_json) 并捕获错误)。

因此,只要注意服务器端和客户端,您应该能够安全地执行此操作。

This depends entirely on a) whether you're scrubbing the JSON on the server side, and (even more) on b) how you're decoding the JSON on the client side when you load it again.

  • Any code that uses eval() to deserialize the JSON into a Javascript object is open to exactly the attack you describe.

  • Any code that uses JSONP to load the JSON (i.e. passing the JSON as a Javascript literal to a named callback function) is open to the attack you describe (it's effectively the same as using eval()).

  • Most robust JSON-parsing mechanisms (e.g. json2.js, the jQuery $.parseJSON function, or native JSON.parse() functions in browsers that support it) will not accept JSON that doesn't follow the JSON specification. So if you're using a library to parse the JSON string, you may be safe.

  • No matter how you intend to load the JSON on the client side, it is good practice to scrub any user-submitted content on the server side. In this case, you might use server-side code to check that the JSON is valid (e.g. using json.loads(user_submitted_json) in Python, and catching errors).

So with some care on both the server side and the client side, you should be able to do this safely.

柠栀 2024-11-23 16:46:39
<plug shameless="true">

JSON sans eval 旨在避免格式错误的 JSON 问题,同时仍然保持高效解析。

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

json.org 上有许多 JavaScript 中的 JSON 解析器。只要考虑安全性(当 JSON 可能来自不受信任的来源时)、考虑速度以及不关心格式错误的 JSON 上的错误时,就应该使用此实现。

</plug>
<plug shameless="true">

JSON sans eval is designed to avoid problems with malformed JSON while still being efficient at parsing.

This JSON parser does not attempt to validate the JSON, so may return a result given a syntactically invalid input, but does not use eval so is deterministic and is guaranteed not to modify any object other than its return value.

There are a number of JSON parsers in JavaScript at json.org. This implementation should be used whenever security is a concern (when JSON may come from an untrusted source), speed is a concern, and erroring on malformed JSON is not a concern.

</plug>
霞映澄塘 2024-11-23 16:46:39

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

JSON has traditionally been parsed using an eval() statement, which is about as insecure as it is possible to get. If you allow this, your application will be insecure.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文