在 JSON 中注入 javascript 和安全性
我有一个在线服务,用户可以在其中创建 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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
这完全取决于 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 nativeJSON.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.
JSON sans eval 旨在避免格式错误的 JSON 问题,同时仍然保持高效解析。
JSON sans eval is designed to avoid problems with malformed JSON while still being efficient at parsing.
传统上,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.