是否可以使用客户端javascript构建动态Web应用程序作为关键点?我不是在讨论服务器端的javascript(比如节点),我说的是用javascript处理大部分网站:模板,表单处理等。
当然,简短的回答是“是的,这是可能的”。但是,当数据库传统上位于服务器上时,我主要担心的是数据库数据操作和安全性。客户端javascript驱动的应用程序应该理想地直接与数据库对话。我知道Couchdb允许这样做,但是如何阻止用户提交查询以查看他们不应该被允许查看的数据?考虑到主要验证应该也是客户端并且很容易伪造,如何处理输入验证?
这在我看来非常有趣但不是真的可行,但也许有一些我不知道的解决方案,或者包围一些数据库的微小安全层,或者我忽略的项目等。
我知道CouchDb独立应用程序(couchapp),它是一种接近我所追求的技术,但它强制执行一种开放的方法,使其不适合我能想到的每一种情况。 / p>
欢迎任何有关此主题的建议。
编辑:如需要示例,请在简单博客中查看。我想在头版中显示最后五个帖子。如果有人以非常简单的方式“破解”页面,他们就可以检索旧帖子。没关系。当我想插入新帖子时,请问什么?如果javascript具有对数据库的开放访问权限,任何人都可以在我的博客中撰写帖子 - 我不想要它。此外,任何人都可以删除我的帖子或其他用户评论,这是我想要的权限。如果我想避免超过500个字符并包含坏词的评论怎么办?再次,在客户端进行验证,用户可以绕过它。
答案 0 :(得分:3)
首先,在客户端上运行代码直接访问数据库听起来很麻烦;它似乎违背了information hiding的概念,它在设计更复杂的系统方面发挥了重要作用。
所以,我认为大部分是学术练习。 :)
大多数集中式数据库系统本身都有多个用户或角色;通常,我们为每个应用程序使用一个“用户帐户”,并允许应用程序以自己的方式定义用户。 (这一直困扰着我,总觉得管理员和用户角色应该也在数据库中分开。但在我看来,我似乎一个人。:)
但是,您可以在您的数据库中定义admin
角色和user
角色,user
角色的GRANT SELECT
权限,以及您GRANT SELECT, UPDATE, INSERT
角色的admin
权限。
PostgreSQL至少有一个预定义的PUBLIC
,可以代替user
;以下示例是从http://www.postgresql.org/docs/9.0/static/sql-grant.html复制的:
GRANT SELECT ON mytable TO PUBLIC;
GRANT SELECT, UPDATE, INSERT ON mytable TO admin;
正确配置pg_hba.conf
文件可以允许admin
个用户从特定IP登录,user
个用户可以从其他任何地方登录,因此您可以限制UPDATE
}和INSERT
只是特定的IP。
现在困难在于用JavaScript编写PostgreSQL客户端库。 :)老实说,如果基于浏览器的JavaScript虚拟机足够灵活,允许任意套接字与远程主机通信,我一点都不知道。 (鉴于WebSockets如此受到如此热烈的欢迎,我猜测JavaScript在HTTP世界中非常困难。)
当然,您必须将HTML页面提供给Web浏览器以某种方式,这意味着拥有HTTP服务器。您也可以要求服务器位于客户端和数据库之间。您还可以在服务器上执行一些处理任务,以避免向客户端发送冗余/不必要的数据......这正是我们今天遇到的情况。 :)
答案 1 :(得分:2)
是的,可能有一个严重依赖JavaScript的Web应用程序;但是,大多数情况下,这一层只是附加;不是替代品。大多数开发人员认为JavaScript只是一个便利层,它使最终用户“更容易”交易,你可以说这是最好的方法安全性。 JavaScript作为一种“权威”工具,将可修复数据清理为可信数据库只是效率不高;除非您希望将所有数据视为不安全,并且每次显示它时都要对其进行清理,并从JavaScript本身处理它。
花哨的动画,AJAX,验证,计算通常仅用于方便,认为有时候使用客户端处理器而不是服务器更好。当然,自56k互联网连接以来,每个人都希望实现“更快”的事实。
安全方面,拥有安全逻辑而没有任何额外保护层可供最终用户使用疯狂。将JavaScript视为额外的手。 JavaScript可以读取什么,用户可以阅读。您不会存储数据库凭据或密码哈希密钥吗? 特别是因为JavaScript可以在运行时使用调试器进行修改,并且几乎所有混淆的代码都可以解决为人类可读的东西。
如果您的来源是安全的,那么将该插入和“安全”数据放在一边,您不应该在获取公开信息方面遇到太多麻烦。
对于javascript前端,我建议使用Backbone.js,这将为您提供组织和互动方面的坚实基础:
Backbone供应结构 JavaScript重量级的应用程序 提供具有键值的模型 绑定和自定义事件,集合 具有丰富的可枚举API 函数,具有声明性的视图 事件处理,并将其全部连接到 你现有的申请表 RESTful JSON接口。
唯一剩下的就是拥有一个可以放在数据库顶部(甚至数据库本身)的薄层,以便在插入时清理数据并存储/计算无法在 ANY 给客户的情况。
<强>更新强>
做你想做的3个真正的要求。
注意:您可以通过在显示时将所有数据视为不安全来绕过“验证和消毒”;就像我提到的非常低效,因为你需要客户端以某种方式解析它以使其安全;并且它很可能会被绕过。另外两个,真的需要你有一个安全的方式来与你宝贵的数据库进行交互。
通常:如果你的后端失败,你的前端会失败。反之亦然。 XSS可以在JavaScript统治网站(例如Facebook)上造成大量伤害。
答案 2 :(得分:-3)
无法从客户端与数据库通信。出于安全考虑,您必须完成两次验证。一旦在客户端,一旦在服务器端。
您可以在客户端执行的任何操作都可以由恶意用户伪造。客户端验证主要是为了方便用户而完成的。这是提供数据库安全性的服务器端验证。