我正在构建一个功能齐全的Web应用程序。当然,您可以在处于“离线”模式时保存到本地数据存储区。我希望能够跨设备同步,这样人们就可以在一台机器上工作,保存,然后再上另一台机器并加载它们的东西。
问题是:
1)将json存储在服务器上是一个坏主意吗?为什么要将服务器上的json解析为模型对象,只需将它作为json传递回(其他)客户端?
2)我不确定我是否想尝试使用NoSql技术。我没有打破json,因为现在数据库中唯一的关系是从用户帐户到他们的条目。除了用户数据之外,域模型将是一个String,它是json。建议欢迎。
理论上,将来我可能想在服务器上进行一些处理或建立更复杂的关系。换句话说,现在我只是要保存json,但将来我可能想要一个更传统的关系系统。 NoSQL方法会妨碍这个吗?
3)这有什么安全问题吗?以JS注入为例?从理论上讲,对于这个用例,用户至少现在无法输入任何内容。
提前谢谢。
编辑 - Thanx的答案。我选择了我的答案,因为它详细介绍了NoSql的优点和缺点。
答案 0 :(得分:3)
如果您的大部分处理都是在客户端使用JavaScript完成的,我认为直接在服务器上存储JSON没有任何问题。
如果您只想玩新技术,欢迎您尝试不同的东西,但对于大多数应用程序来说,没有真正的理由偏离传统数据库,而SQL使生活变得简单
只要您使用标准JSON.parse
函数来解析JSON字符串,您就是安全的 - 某些浏览器(例如Firefox 3.5及更高版本)已经具有本机版本,而Crockford的{{3可以在其他人中复制此功能。
答案 1 :(得分:3)
服务器上的JSON
将JSON存储在服务器上并不是一个坏主意,特别是如果你使用像MongoDB或CouchDB这样的noSQL解决方案。两者都使用JSON作为其原生格式(MongoDB实际上使用BSON,但它非常相似)。
noSQL方法:假设CouchDB为存储引擎
安全强>
确保使用浏览器JSON.parse或安全的Javascript库(json2.js)解析JSON文档。
<强>结论强>
我认为我建议在这里使用noSQL的原因,特别是CouchDB,是因为它将为你处理所有困难的东西。复制将很容易进行设置。您不必担心并发等问题。
那就是说,我不知道你正在建造什么样的应用程序。我不知道你们与客户的关系是什么,以及让他们将CouchDB放在他们的机器上是多么容易。
<强>链接强>
在查看应用程序后,我认为CouchDB不会是一个很好的客户端选项,因为您不会要求人们安装数据库引擎来播放soduku。也就是说,我仍然认为它是一个很好的服务器端选项。如果您想将服务器CouchDb实例与客户端同步,您可以使用类似BrowserCouch的内容,这是用于本地存储的CouchDB的JavaScript实现。
答案 2 :(得分:2)
只是阅读你的帖子,我不得不说我非常喜欢你的方法,它预示着许多Web应用程序将来可能会运行的方式,包括本地存储元素(用于断开状态)和在线存储(主存储)数据库 - 将所有客户记录保存在一个位置并与其他客户端设备同步。)
以下是我的答案:
1)在服务器上存储JSON:我不确定是否会将对象存储为JSON,如果您的应用程序非常简单,可能会这样做,但这会妨碍使用数据(例如,在批处理作业上运行报告和通过电子邮件发送)。我更喜欢使用JSON自行传输信息,使用SQL数据库存储信息。
2)NoSQL方法:我认为你已经回答了自己的问题。我首选的方法是立即设置一个SQL数据库(如果所需的额外资源不是问题),这样你就可以节省一些工作来为NoSQL设置数据访问层,因为你可能不得不删除它在将来。如果您不想要功能齐全的RDBMS,SQLite是一个不错的选择。
如果编写模式太麻烦并且您仍然希望在服务器上保存JSON,那么您可以使用单个表对一个JSON对象管理系统进行散列,并在服务器端进行一些解析以返回相关记录。与保存/删除文件相比,这样做更容易,并且需要的权限更少。
3)安全性:您提到目前没有用户输入:
“对于这个用例,用户没有 得到任何东西“
然而,在问题的开头你还提到用户可以
“在一台机器上工作,保存,然后获取 在另一台机器上加载他们的 东西“
如果是这种情况,那么你的应用程序将存储用户数据,你没有提供一个很好的GUI来做这件事并不重要,你将不得不担心多个角度的安全性{{{ 1}}或类似工具只能解决问题的一半(客户端)。
基本上,您还必须检查服务器上的POST请求的内容,以确定发送的数据是否有效且切合实际。 JSON对象(或您要保存的任何数据)的完整性需要在服务器上验证(使用php或其他类似语言)在保存到数据存储之前,这是因为有人可以轻松绕过您的javascript层“安全”并篡改POST请求,即使你没有打算这样做,然后你的应用程序将把恶意输入发送到客户端。
如果你在服务器方面整理了一些东西,那么JSON.parse
在防止JS注入方面就变得有点过时了。如果您依靠远程网站API获取一些数据,那么获得额外的图层仍然不错。
希望这对你有用。