如何创建无法访问数据的Web应用程序?

时间:2008-11-20 20:54:10

标签: database security encryption

前提:即将开展的项目的要求包括除了授权用户之外没有人可以访问某些数据。这通常很好,但这种情况并不常见。这些要求规定,即使程序员或任何其他IT员工也无法访问此信息。 (他们希望我存储它而不能看到它。)

在我提出的所有场景中,我总能找到一种访问数据的方法。让我来介绍其中一些。

方案I:限制实时数据库上的表,以便只有SQL管理员可以直接访问它。
Hack 1:我推出了一项更改,将数据发送到另一个表以供日后查看。此外,SQL管理员可以查看数据,这打破了要求。

方案II:加密数据,以便需要密码才能解密。该密码仅供用户知道。每次创建新记录时以及每次检索旧记录中的数据时都需要它。加密/解密将在JavaScript中发生,因此密码永远不会被发送到服务器,在那里可以记录或嗅探。 Hack II:推出一项更改,记录javascript中的按键并将其发回服务器,以便我可以检索密码。或者,推出一个更改,只是将未加密的数据存储在隐藏字段中,该字段可以发布到服务器以供以后查看。

场景III:与场景II相同,只是加密/解密发生在我们无法控制的网站上。这个神奇的网站将允许用户输入密码和加密或纯文本数据,然后使用javascript来解密或加密该数据。然后,用户可以只复制加密文本并将其放入字段中以获取新记录。他们还必须使用此网站查看旧记录的纯文本 Hack III:除了在他们的系统上安装一个完整的密钥记录器,我不知道如何打破这个。

因此,情景III看起来很有希望,但对用户而言却很麻烦。我还有其他可能忽略的可能性吗?

12 个答案:

答案 0 :(得分:11)

如果您可以在页面上使用javascript,那么我认为您无法做任何事情。如果你可以在浏览器中看到它,那就意味着它在DOM中,这意味着你可以编写一个脚本来获取它并在解密后发送给你。

这些问题通常不是通过控件来解决的:

  1. 所有程序员都需要一定程度的许可和背景调查
  2. 他们接受过培训,了解推出用于访问数据的代码是一种可以攻击或更糟糕的攻击
  3. 某些领域的每一次变化都需要某种签收
  4. 例如 - 没有签收的页面上没有JavaScript。

    如果你被允许添加你想要的任何代码,那么总有一种方法,IMO。

答案 1 :(得分:3)

要求客户提供保密协议,您可以签名,签名,然后查看您想要的数据。

我想知道的是,你究竟能用加密数据做什么?几乎所有应用程序都要求您对数据进行某些过滤,无论是将其移动到所需位置,修改它,消毒还是显示它。否则,你只是一个美化的管道,你不需要做任何工作。

我能想到你不会在哪里查看数据或用它做任何事情的唯一方法是使用CRUD选项进行表格映射的简单形式。如果您知道数据将以何种格式进入,因为您应该能够使用RoR(一个简单的皮肤)将某些内容卷起来,将SSL放入混合中并将其滚出。使用相同格式的虚拟数据进行测试,然后进行设置。

事实上,您的客户是否无法提供虚拟数据进行测试?如果他们可以,那么你的生活很简单,因为你所做的只是提供一个“可安装的”并告诉他们如何编辑配置文件。

答案 2 :(得分:3)

我认为您仍然可以通过以下方式创建应用:

  1. 创建一个开发人员数据库并为其设置用户。
  2. 询问他们:需要在屏幕上显示的每个字段的数据类型,大小和名称。
  3. 设置屏幕,在数据库中创建接受其指定的数据类型和大小的列。
  4. 将应用程序部署到生产环境,连接到空数据库。获取有权限的人(不是您)进入并在数据库用户上设置密码,并在Web应用程序中为数据库用户设置密码。
  5. 授权用户可以随心所欲地执行任何操作,但您从未看到任何数据。
  6. 当然,维护应用程序和调试将是一个婊子!

    - 回答评论:

    1. 好的,所以在数据库和web应用程序的配置中设置用户名的密码后,编写一个连接数据库的程序,设置一个随机密码,然后将相同的随机密码写入网络配置。

    2. 防止来自机器的任何传出数据包(除了一组授权工作站) - 因此您无法安装间谍软件。

    3. 然后将两台服务器上的管理员密码设置为相同的随机密码,然后删除服务器上的所有其他用户,删除程序并删除程序源代码。

    4. 使用DOD算法擦拭开发者机器的硬盘驱动器,然后将它们扔进工业粉碎机。

    5. 10。如果服务器需要调试,请将其丢弃在垃圾箱中,购买一个新的,然后从#1开始。

      但严肃地说 - 这是一个无法解决的问题。对此最好的答案是:

      告诉他们他们没有申请。把你的东西写在纸上。把它放在一个文件夹中。将其锁在保险库中。推,重复。

答案 3 :(得分:2)

情景3不会将所有数据暴露给魔术网站吗?这听起来不像是一个可解决的问题(至少我想不出解决方案)。

答案 4 :(得分:2)

使用最容易实现的解决方案,我认为要求显示客户端不了解软件开发,因此您应该很容易出售任何方法。

答案 5 :(得分:2)

我不得不说我真的不喜欢在客户端上使用JavaScript来解密数据的想法。这是一个巨大的漏洞,因为任何脚本(黑客,GreaseMonkey,IE7Pro等)都可以访问DOM并从页面中获取数据。

此外,很难解决键击记录器的问题。如果你把它们扔进混合物中,那么你的选择是有限的。此时,您需要一个安全FOB,如RSA(通常与公司VPN一起使用),以生成真正随机的PIN。这可能是昂贵的,这是一个痛苦,我只看到它与VPN一起使用,但我认为它也适用于网站。

就网站而言,我坚持使用HTTPS并找到通过WebServer加密/解密的方法,而不是依赖JavaScript。 SSL流量不太容易嗅探(非常难以解密),因此允许加密和解密发生在服务器端(IMHO)更安全。

以银行业务场景和其他金融机构为起点,然后从那里开始。尽可能不要过于复杂。

答案 6 :(得分:2)

只要您可以访问其所在的服务器,就无法保证不会侵入数据。因此,告诉雇主他们必须在其他地方托管数据,并通过安全的HTTPS连接授予对客户端浏览器的访问权限。

您可以设计网页以安全地动态加载XML数据流,并使用客户端上的XSLT脚本将其格式化为网页。

有关示例,请参阅http://www.w3schools.com/xsl/xsl_client.asp

通过这种方式生成代码,但您永远无法访问数据。只有用户才能访问自己的数据。

至于雇主如何在不授权任何IT人员访问数据的情况下托管数据,这就是他们的问题。这是一个愚蠢的要求。

答案 7 :(得分:2)

我认为我只是告诉他们,他们要么要相信我们中的几个人才能访问(而不是看它),或者他们没有得到一个项目。

感谢您的回答。如果你有这些想法,请随意发表更多想法。

答案 8 :(得分:1)

您永远不会有100%的安全性,额外的安全性会以速度/价格/便利性等为代价。

让我们假设您采用方案3 - 您的程序员之一可以使用社交工程从其中一个用户获取密码。再见安全。

如果人们可以在它周围走动,那么高安全性的铁门作为门是没有意义的。只需实现一定程度的安全性。

答案 9 :(得分:1)

  

(他们希望我存储它而不能看到它。)

嘿,录音行业希望人们能够听他们的音乐,但不能复制它。听起来他们有时会聚在一起!

他们的想法不会因DRM不起作用的原因而起作用:信任链本身就受到了损害。加密示例通常使用Alice,Bob和Charlie,其中Alice试图在没有Charlie收听的情况下与Bob通信。使用DRM,信任链受到损害,因为Bob和Charlie是同一个人。根据您的情况,Charlie是编写Alice和Bob用来进行通信的软件的人。这是一种隐含的信任,因为如果你不信任查理那么你也不能相信查理的软件。

这是问题的根源:信任。如果他们不能信任程序员,游戏就会在开始之前结束。

答案 10 :(得分:1)

根据他们的目标确实存在很多选择,但我对他们的偏执,呃,意图感到困惑:

  • 这个他们的(和最终用户)数据是否希望保持私人或最终用户数据不被所有人保密?
  • 您的(或任何签约的)公司是否只是怀疑?
  • 他们是否害怕过线窥探?
  • 他们是否害怕通过JavaScript或浏览器插件访问DOM?

他们是否计划分阶段部署?在这种情况下,您使用没有真实数据的测试/开发服务器,但无法使用真实数据访问生产服务器,并且DNS日志记录和/或防火墙规则会阻止您的所有黑客无法检测到。

最终,如果数据存储在数据库中,那么程序员和数据库管理员可以通过一起工作来获取数据。期。但是,良好的审计应该能够发现这一点。

答案 11 :(得分:0)

如果这确实是一项要求,防范这种情况的唯一方法是聘请外部公司在发布软件之前对代码进行审核,这将是非常昂贵的。