如果数据的安全性可以在数据库端执行?

问题描述 投票:6回答:8

我们在建立一个新的框架,并为我们的新的内部应用程序的经商之道的过程。我们目前的设计决定了所有的安全逻辑应该通过我们的数据库,所有的信息进行处理(我的意思是全部)将通过存储过程进出数据库。

理论是,数据访问层从存储过程请求信息和认证越过到数据库。该数据库确定用户的角色/权限,并决定是否要执行的任务(不管是获取数据或进行更新)。

我想这意味着更少的数据库事务。一个调用数据库。如果安全是我们的数据访问层,这将需要1个数据库调用来确定用户是否有适当的权限,然后1个单独的数据库调用执行的操作。

就我个人来说,找到SQL Management Studio中完全缺乏作为一个IDE。我最关心的是,我们最终将不得不保持我们的存储过程中的业务逻辑的一些讨厌的量对于一些很小的性能提升。

现在,我们使用LINQ我们的ORM。这似乎轻,速度快,但最重要的是,它真的很容易迅速发展。

是维修费用值得的性能提升?我们是在欺骗自己,以为甚至会出现明显的性能提升?或者,我们只是做我们自己的噩梦?

我们的环境:

  • 内部,非关键业务应用程序
  • C#/ ASP.NET 3.5
  • Windows 2003中
  • MS SQL Server 2005中
  • 35中等大小的网络应用程序用大约500个用户
sql security stored-procedures
8个回答
8
投票

不要那样做。我们最近有一个非常坏的经验,当“数据库大师”决定去另一家公司。所有的逻辑在程序维护仅仅是可怕的!

是的,你将会有一些性能改进,但是这不值得。事实上,性能甚至没有在内部应用程序是一个大问题。在良好的服务器投入更多的资金。它会还清。


3
投票

不幸的是,没有一个“真正的答案”。你必须做出的选择取决于多种因素,如:

  • 团队与给定解决方案的熟悉程度(即,如果其中大部分是舒适的书写SQL,它可以在数据库中,但是如果其中大部分是更舒适与C#中,它应该是在代码中)
  • “政治权力”每一方的
  • 等等

没有决定性的优势在任何方向(如你所说的性能提升是最小的),有一两件事要记住的是DRY(不要重复自己)原则:不重新实现的功能两次(在代码和在DB),因为让他们在同步将是一场噩梦。选择一个解决方案,并坚持下去。


2
投票

你可以做到这一点,但它是一个巨大的痛苦,以制定打击和维护。从别人谁是,几乎所有的业务逻辑是在存储过程中编码的项目拿去吧。

为了安全起见,ASP.NET已经用户和角色管理烤到它,所以你可能会节省旅行数据库中还等什么呢?在交换变得更为恼人的处理和调试系统和验证错误,因为他们必须从数据库中泡了。

单元测试是困难得多,因为可用的单元测试存储过程的框架是远远欠发达。

适当的空中接力和领域驱动设计是所有,但窗外。

而性能提升将是如果有微小的。我们谈过这个here

我建议,如果你想你的理智保存为一个开发人员,你打齿和指甲保持数据库作为持久层只


2
投票

恕我直言:

应用服务层 - >应用程序逻辑和验证 应用数据层 - >数据的逻辑和安全 数据库 - >数据的一致性

您将通过存储过程的做法迟早会被咬以后,我这里学到了艰辛的道路。 特效是非常适合那些需要大量的性能一杆操作,但CRUD部分是数据层工作


1
投票

存储过程通常是安全的胜利。简化您的应用程序和数据库之间的关系减少的地方,你可以有错误的次数;在接口业务逻辑数据库代码中的错误往往是安全问题。所以,你的DBA是没有错的有关锁定下来到存储过程。

到锁定申请下来对存储过程的另一个好处是,应用程序堆栈的数据库连接都可以有权限锁定到特定的存储过程调用,别无其他。

具有涉及安全逻辑为您的应用DBA的好处是,不同的应用程序的功能和角色可以在数据库下被划分到的意见,这样即使需要动态SQL和通用的SELECT语句,从SQL漏洞的损害可约束。

这样做的另一面是,当然,失去了灵活性。一个ORM显然要更快发展比具有DBA在存储过程的参数恒定的谈判。而且,随着这些存储过程的压力增大,这是越来越多的可能是程序本身将诉诸动态SQL,这将是多么的脆弱,因为应用程序组成的SQL攻击。

有一个幸福的中间地带在这里,你应该试着去找到它。我最近在项目上的工作是从非常可怕的SQL注入问题保存,因为一个DBA一直在小心翼翼地配置了数据库,它的连接,而对于“最小权限”它的存储过程,因此,任何一个数据库用户只有访问他们要知道需要。

很显然,当你在你的应用程序逻辑编写SQL代码,请确保您持续使用参数化准备好的语句,你发现你的消毒输入,即你注意到国际输入的(有很多,很多方法可以说单-quote通过HTTP),而你铭记当输入用于列的宽度过大数据库的行为。


1
投票

这一切都取决于你的情况下,它可能是最好不要走SP路线,并尽一切的DDD的方式(请在代码中的域模型和使用)。

但是,如果你有不只是使用你的应用程序,但许多人,那么你或许应该考虑Web服务的数据库。以任何方式,数据库应该只通过一层强制执行其他业务规则,你会用“脏”数据落得和消毒后您的数据是一个比事先写一些业务规则,更大的痛苦访问。一个好的数据库应检查约束和索引设置,所以它会有一些业务规则,不管你喜欢还是不喜欢。

如果你要处理的百万千万的记录,你会很高兴有一个良好的DB-家伙,解决问题为您服务。


0
投票

我的观点是应用程序本身应该处理身份验证和授权。在数据库方面需要你应该只处理数据的加密。


0
投票

我已经建立在过去的存储过程的应用程序。在你的情况有可能的方式,以保持认证数据库层,并在C#中的业务逻辑。使用视图来限制数据(你只看到你有权行)。这些视图可以在LINQ中使用一样简单的表。您可以设置您的更新与存储过程发生。

这允许LINQ,在C#的业务逻辑,以及在其控制对数据的访问的数据库中的一个共同的认证层。

© www.soinside.com 2019 - 2024. All rights reserved.