客户端javascript驱动的网站

时间:2011-05-19 19:26:54

标签: javascript security client-side database-driven

是否可以使用客户端javascript构建动态Web应用程序作为关键点?我不是在讨论服务器端的javascript(比如节点),我说的是用javascript处理大部分网站:模板,表单处理等。

当然,简短的回答是“是的,这是可能的”。但是,当数据库传统上位于服务器上时,我主要担心的是数据库数据操作和安全性。客户端javascript驱动的应用程序应该理想地直接与数据库对话。我知道Couchdb允许这样做,但是如何阻止用户提交查询以查看他们不应该被允许查看的数据?考虑到主要验证应该也是客户端并且很容易伪造,如何处理输入验证?

这在我看来非常有趣但不是真的可行,但也许有一些我不知道的解决方案,或者包围一些数据库的微小安全层,或者我忽略的项目等。

我知道CouchDb独立应用程序(couchapp),它是一种接近我所追求的技术,但它强制执行一种开放的方法,使其不适合我能想到的每一种情况。 / p>

欢迎任何有关此主题的建议。

编辑:如需要示例,请在简单博客中查看。我想在头版中显示最后五个帖子。如果有人以非常简单的方式“破解”页面,他们就可以检索旧帖子。没关系。当我想插入新帖子时,请问什么?如果javascript具有对数据库的开放访问权限,任何人都可以在我的博客中撰写帖子 - 我不想要它。此外,任何人都可以删除我的帖子或其他用户评论,这是想要的权限。如果我想避免超过500个字符并包含坏词的评论怎么办?再次,在客户端进行验证,用户可以绕过它。

3 个答案:

答案 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个真正的要求。

  1. 身份验证(后端):访问数据库,删除注释等都需要这样做。
  2. 验证&amp;清理(​​后端):限制字符数量,逃避恶意代码,禁止使用单词。
  3. 敏感数据处理(后端):使用哈希来获取密码......
  4. 注意:您可以通过在显示时将所有数据视为不安全来绕过“验证和消毒”;就像我提到的非常低效,因为你需要客户端以某种方式解析它以使其安全;并且它很可能会被绕过。另外两个,真的需要你有一个安全的方式来与你宝贵的数据库进行交互。

    通常:如果你的后端失败,你的前端会失败。反之亦然。 XSS可以在JavaScript统治网站(例如Facebook)上造成大量伤害。

答案 2 :(得分:-3)

无法从客户端与数据库通信。出于安全考虑,您必须完成两次验证。一旦在客户端,一旦在服务器端。

您可以在客户端执行的任何操作都可以由恶意用户伪造。客户端验证主要是为了方便用户而完成的。这是提供数据库安全性的服务器端验证。