与数据库进行父子进程通信的最佳设计
Posted
技术标签:
【中文标题】与数据库进行父子进程通信的最佳设计【英文标题】:best design of parent-child process communication with a database 【发布时间】:2011-03-18 03:54:04 【问题描述】:假设我们有父进程A
。 A
接收输入 username
和 password
并在 AllUsers
数据库中查找它们以确保 username/password
组合有效。 A
然后启动一个新的子进程B
并将username/password
传递给它。 B
需要来自数据库的更多信息,例如用户的age
和nickname
。
应该只允许A
拥有数据库访问权限:
A
从
数据库并将其全部传递给B
via
创建时的命令行字符串
新的B
。即使A
没有
关心age
和nickname
。 B
将解析字符串以获取字段。
A
只通过
username/password
到 B
和 A
具有 WCF
让B
调用的服务
服务,这使得A
访问
数据库并将信息返回给B
。
A
和 B
是否都应该具有数据库访问权限:
A
只手B
username/password
让B
访问数据库,以便它可以获取
age/nickname
自己。
我们是否应该有多个数据库:
A
只能访问AllUsers
数据库。但我们也有一个数据库
对于每个用户。因此,10,000 个用户 =
10,000 个数据库。 B
仅访问
一个用户数据库为一个
它关心的用户。
请记住,A
只会有一个,但B
可能会有数百或数千个进程。我想保持负载尽可能均匀,即,如果成千上万的B
需要与之交谈,我不希望A
成为瓶颈。但我也担心让两个进程同时访问同一个数据库,这似乎可能会导致访问缓慢或数据损坏。
这些是我对如何去做的想法。哪一个是最好的?还是有更好的方法?
【问题讨论】:
【参考方案1】:在我看来,如果可能的话,用户名和密码不应该以任何方式传输,而且在你的场景中似乎很容易避免它。首先,任何进程都不应拥有对AllUsers
数据库的完全访问权限,因为它保存着安全敏感数据。一个好的方法是使用只有A
有权访问的存储过程,将用户名和密码(哈希)作为参数传递。这样,如果进程A
受到威胁,攻击者就不能简单地获取用户名和密码列表。他/她可以尝试暴力破解,但使用足够安全的密码(和适当的监控),您应该有足够的时间来发现事件。如果它们是正确的,则存储过程应该返回一个加密安全的随机会话令牌。这应该是唯一要传递的信息,并且您执行此操作的方式(WCF、命令行参数等)并不重要,选择您喜欢的任何内容。进程B
应该能够通过将令牌作为参数并根据您的需要返回过滤结果的存储过程来查询它需要的任何信息。例如进程B
应该只能读取它自己的用户行但没有密码。添加一些收尾工作,例如清理旧会话的作业,您的设计既安全又易于维护。
【讨论】:
尽管最初的帖子更多地是关于可扩展性,但我同意在设计的这一点上应该考虑安全性。我建议永远不要将密码存储在数据库中。只需将密码的单向哈希存储为每条记录一个唯一的盐,然后即使您的数据库遭到破坏,密码仍然是安全的。 这带来了一个有趣的问题。如果不在数据库中,密码应该存储在哪里?可能不得不问另一个 SO 问题。 @jb:为了成为身份验证的安全基础,密码应存储在其所有者耳朵之间的“湿件”中,而不是其他任何地方。这就是 Diadistis 和 Brent 提倡存储加盐哈希而不是密码本身的原因。【参考方案2】:数据库旨在处理多个同时访问。除非您在做一些奇怪的事情,否则如果您主要关心的是避免瓶颈,我不明白为什么 A 和 B 不应该访问数据库。
我会避免为每个用户创建一个数据库,因为您可能会在同一台机器上运行许多(如果不是全部)实例。
我建议阅读数据库功能和扩展。
希望这会有所帮助。
【讨论】:
以上是关于与数据库进行父子进程通信的最佳设计的主要内容,如果未能解决你的问题,请参考以下文章