4

在 ASP.NET 应用程序的上下文中工作,我正在创建一个页面,该页面将能够针对我们环境中的许多数据库之一执行数据库脚本。为此,我们需要提示用户输入用户名/密码组合,该值可用于所有服务器而不会出现问题。

问题是存储这些信息的最安全位置在哪里?我们需要暂时存储它,因为当他们在这个特定页面上时,他们可能会在多个回发中执行数百个脚本。据我所知,我有 3 个选项,但我不确定哪个是最好的。以下是我对选项的看法,这里的每个人都有什么建议?什么是最安全的,同时仍然对用户友好?

在 Viewstate 中存储信息

我们讨论的第一个想法是在页面的 ViewState 中由用户提供信息后存储信息。这很有帮助,因为信息只在页面的生命周期内存在,但是,我们不确定安全隐患。

在 Session 中存储信息

我们的下一个想法是将它存储在会话中,但是,这样做的缺点是信息可以提供给应用程序内的其他页面,并且信息总是在服务器的内存中徘徊。

在应用程序中存储信息

我们的最后一个想法是将其存储在应用程序缓存中,并带有用户特定的密钥和 5 分钟的滑动到期时间。这仍然对其他页面可用,但是,它将确保信息在较短的时间内被缓存。

为什么?

最后一个重要的问题是“你为什么要这样做?”。我们为什么不直接使用他们的 Lan id 呢?好吧,由于缺乏对委派的网络支持,我们不能使用 lan id。

S0 推荐的解决方案是什么?为什么?它有多安全,我们能做到吗?

更新

已经讨论了重要的信息。澄清一下,我们在 Intranet 环境中运行,由于网络的限制,我们不能使用模拟或委托。

4

7 回答 7

3

在我看来,这个自然的地方是会议。

我不确定为什么您似乎害怕“应用程序中的其他页面”(您控制应用程序,不是吗?),但如果您真的是,您可以在存储之前使用某种加密。

但是,如果您要这样做数据也可以存在于 ViewState 中。

于 2009-01-16T17:07:42.440 回答
3

我不喜欢这些想法中的任何一个,但完全讨厌 viewstate 想法

我不知道您要附加多少个数据库,但如果数量有限,我想知道是否以标准安全方式处理您的身份验证和授权,然后使用身份模拟通过集成安全性连接到这些数据库具有最小权限的帐户。

于 2009-01-16T17:15:22.440 回答
1

ViewState方法很好,但存在您将用户名和密码提供给客户端的问题。即使你加密它,如果某些攻击者拥有加密密钥,情况也不会很好。

关于SessionandApplication方法,我认为Application方法没有意义。数据是用户特定的,所以Session应该是要走的路。一旦用户的会话关闭,它就会消失。顺便说一句,如果您选择将其存储在服务器上,请使用SecureStringclass.

于 2009-01-16T17:04:42.663 回答
1

正如 John MacIntyre 所写,您应该为此使用集成的安全性和模拟。

如果由于某种原因您不能使用它并且您将提供自己的登录页面,请务必使用 SSL 来加密浏览器和您的服务器之间的流量。如果不使用 SSL,使用 ViewState 方法也是完全不安全的,有一些工具可以非常轻松地查看内容。从您列举的方法中,最好的方法是使用会话状态。您可以从 Web 服务器内存中卸载保存会话状态的工作,并将该数据保存在数据库中,您可以按照您想要的方式保护它。如果您不喜欢这些工作方式,您甚至可以编写自己的会话状态提供程序并在那里应用您需要的安全性。

于 2009-01-16T17:40:00.783 回答
0

存储在 Viewstate 中会增加您的曝光率,因为密码会一次又一次地在互联网上传播。加密是否足以解决此风险取决于您。

使用 Application 或 Session 都将密码保存在服务器中。如上所述,SecureString 将防止人们简单地从内存中读取密码。会话将扩展到更多用户,并且可能比应用程序更容易扩展到多个服务器。除非您确定您永远不会使用超过 1 个 Web 服务器,否则我不会使用 Application,因为同步所有服务器将取决于您。

于 2009-01-16T17:19:57.763 回答
0

永远不要存储密码!

而是存储密码的哈希值。请参阅:http ://en.wikipedia.org/wiki/Crypt_(Unix)#Library_Function 。

我知道这并不能回答问题,但是越多的程序员忽视这个建议,犯罪分子就越容易窃取数据。不要让您的组织成为新闻故事。

于 2009-01-16T20:29:45.713 回答
0

用户名/密码真的不应该存储在任何地方。

您存储实时数据库连接,最好来自 Session 对象中的池。只要登录数据库,您只需要用户名/密码。

虽然另一个页面可以使用实时连接,但它不会像存储用户名/密码那样让其他任何人永久访问数据库。

于 2010-12-27T06:54:09.303 回答