2009-01-07 80 views
12

我已经看到了一些指导,这建议您通过分层通过存储过程的所有数据访问安全的数据库。使用存储过程访问数据会提供哪些安全优势?

我知道,SQL Server,可以保护表,偶数列针对CRUD操作。

例如:

--// Logged in as 'sa' 
USE AdventureWorks; 
GRANT SELECT ON Person.Address(AddressID, AddressLine1) to Matt; 
GRANT UPDATE ON Person.Address(AddressLine1) to Matt; 

--// Logged in as 'Matt' 
SELECT * from Person.Address;      --// Fail 
SELECT AddressID, AddressLine1 from Person.Address; --// Succeed 
UPDATE Person.Address SET AddressLine1 = '#____ 2700 Production Way' 
     WHERE AddressID = 497;      --// Succeed 

既然你可以确保表和偶数列针对CRUD操作,如何使用存储过程中没有提供额外的安全性,还是安全性的管理?

+0

可能是因为如果你是一名DBA是有效的最关键类型的安全性 - 它可以保护利用程序代码的程序员来编写查询数据库。 (半开玩笑......) – dkretz 2009-01-08 22:36:02

回答

4

存储过程,允许用户,但只有有限的方式执行CRUD操作(插入,更新,删除)提供额外的安全。例如,允许用户Matt更新某些行的地址,但不能更新其他行的地址。

它允许你添加数据的检查,以确保插入的数据是有效的数据,不是随机的垃圾。对于大多数情况,您可以使用约束和/或触发器来完成这些工作,但有一些限制。存储过程通过确保用户允许执行的操作来增强安全性。

它很容易,虽然单点接入,通过应用程序来控制,而不是通过任意数量的接口来跟踪对数据库的更改。该过程可以更新审核日志。

11

因为通过限制所有访问这些存储的特效,你已经建立了一个定义的数据库接口,通过它所有的访问必须发生......既然你将有DENY'd直接选择,插入,更新和删除操作依据表和视图,没有人可以直接写自己设计的SQL,做任何他们想要的...如果你想插入到限制在员工分配到三个以上的项目,只有具有这些员工的职员表如果能力测试的分数大于85,那么你可以在SaveEmployee sproc中写入这个约束条件,并且它会抛出一个例外情况给任何试图这样做的客户端代码...

当然你可以做同样的事情使用客户端代码,但使用sProcs make S中的过程更容易设计和管理,因为它是在同一个地方,并尝试访问该数据库系统所有应用程序都符合你的存储过程定义任何约束和/或安全规定......没有恶意开发者编写如果该SProc是插入或更新记录的唯一方式,则命中数据库的新独立客户端应用程序可以忽略或解决SProc中的约束或安全规定...

+0

这是“流氓”,而不是“胭脂”......除非他们正在开发新的化妆品系列) – 2009-01-09 14:57:54

+0

呵呵!谢谢......我编辑了拼写错误......(我从一个他们没有教我们打字的年龄......我从来没有学过......所以我用了三个手指,并做了很多拼写错误! ) – 2009-01-09 15:39:54

10

您可能不想给马特carte -blanc直接更新某些表或列。如果Matt决定这样做:

UPDATE Person.Address SET AddressLine1 = NULL 

哎呦。 Matt忘记了WHERE子句并且只是清理了你的数据库。或者,也许马特刚刚对他的老板生气,并决定在一天结束时退出。或者,也许马特的密码并不像应该有的那样安全,现在是黑客了。

这只是一个简单的例子。对表和列的控制可能变得更加复杂,并且可能通过除存储过程以外的任何其他方法而变得不可行。

+0

嗯...不知道这是否真的是安全性好处...保护数据库免受开发人员犯错误...备份? – 2010-01-27 12:42:36

0

存储过程更好,因为在存储过程(IIRC)的安全性将在表/列王牌安全。

对于单表访问,这没什么大不了的。但是,如果您的操作涉及多个表上的多个列,则对于表/列有一个访问/拒绝标志可能无法适用于所有情况。

但是,存储过程可以执行组合操作,您可以在其上适当地设置安全性。

1

在大多数(所有?)RDBMS中,您可以将特定表上的“授予”访问权限给特定用户。一个存储过程可以作为一个不同的用户运行,而一个用户可以访但是,存储过程与访问整个表格不同,它可能会首先检查某些内容并仅返回符合您特定安全性问题的行。

您可能能够对视图执行类似的检查,但存储过程通常更灵活,因为它们几乎可以运行任何SQL - 比较结果并决定返回哪些行。

2

在SQL Server中,如果正确使用存储的特效(不需要动态SQl),则不必授予对表的任何直接访问权限。这意味着你的用户只能执行由proc定义的东西。如果您的数据库中有任何财务数据或敏感数据,则只有尽可能少的人(通常只有dbas)才能直接访问表。这严重降低了欺诈或心存不满的员工甩掉了您的业务关键数据或员工窃取个人信息从而实施身份盗用的风险。在会计方面,这是一个必要的内部控制和开发人员的便利或个人希望从用户界面动态地执行所有操作应该被数据的不安全性所压倒。不幸的是,在所有太少的公司中,事实并非如此。大多数开发者似乎只担心他们的数据会受到外部威胁,但内部威胁通常要关键得多。

如果您限制用户在表级别,然后用户启动查询来执行合法插入,则不会发生。如果您授予他们插入权限,则他们可以执行任何他们想要的特定插入,而不仅限于来自用户界面的插入。通过存储过程,他们只能执行proc特别定义的事情。

0

简而言之,它可以让你在功能上而不是结构上定义安全。换句话说,它限制了用户允许做的事情(具有更大的粒度),而不是什么数据库对象可访问(以非常粗的粒度)。

请注意,我们正在谈论“由DBA“而不是站点或系统管理员或软件模块,所有这些都是有用的,并且是整体安全基础架构的一部分。

0

在这里详细讨论的第一个好处是对权限的更好控制 - 用户可以被限制到特定的行,而不仅仅是每列(在大型系统中这是一个很好的方法); SP可以执行业务逻辑和事务逻辑;数据可能只能根据其他数据(例如连接)进行检索;更新可能一次只限于单行;等等。

其次,这可以提供额外的防范SQL注入(尽管它不完整和自动)的保护层。虽然这可能被破坏,但是SP中的动态SQL或错误的串联调用,SP确实会强制执行参数类型,而不会将代码与数据分离。

第三,它涉及到控制,在开发阶段 - 通常你已经训练数据库管理员写的SP,而不是程序员(谁在代码中训练的...)

这是不提到非安全性好处,例如更好的性能。

0

在存储过程中,您可以添加逻辑控件。如果某些内容不正确,则可以返回错误代码,而不是直接更新表数据。

例如,您有一个反馈系统。反馈只能在管理员开始反馈活动后提交。它只是更新某个表中的一个标志。 然后,当用户提交反馈时,SP可以检查标志是否已设置。

Select @IsFeedbackDefined = IsFeedbackDefined From sometable where ID = @ID 

IF @IsFeedbackDefined is Null or @IsFeedbackDefined = false 
Begin 
    Return -2 --can not submit feedback 
End