【发布时间】:2009-07-23 19:39:44
【问题描述】:
我对 SQL 世界很陌生。以下是我的问题:
- 与应用程序中的普通 SQL 语句相比,存储过程有哪些优势?
- 存储过程是否有助于消除 SQL 注入?
- 在 Microsoft SQL Server 中,它被称为存储过程。在 Oracle、MySQL、DB2 等中怎么样?
感谢您的解释。
【问题讨论】:
标签: sql database stored-procedures
我对 SQL 世界很陌生。以下是我的问题:
感谢您的解释。
【问题讨论】:
标签: sql database stored-procedures
如果您以参数化方式调用存储过程,则仅直接防止 SQL 注入。如果您的应用程序中仍有一个字符串,其中包含过程名称并将用户输入的参数连接到代码中的该字符串,那么您仍然会遇到麻烦。
但是,当单独使用时,存储过程允许您通过禁用除 EXEC 命令之外的所有内容的权限来添加一些额外的保护。除此之外,参数化查询/准备语句通常由服务器缓存,因此几乎在各个方面都像存储过程。
尽管如此,存储过程对于大型企业来说有两大优势:
当然,这些优势并非没有代价:
【讨论】:
我在使用存储过程时考虑到的一些好处
【讨论】:
在大多数情况下是的,SQL 注入在存储过程中的可能性要小得多。尽管有时您想要传递存储过程的一些数据,这些数据需要您在存储过程中使用动态 SQL,然后您又回到了开始的位置。从这个意义上说,我认为它们与在支持它们的编程语言中使用参数化查询相比没有任何优势。
我个人讨厌存储过程。将代码放在两个不连贯的地方是一件很痛苦的事情,它使部署变得更加复杂。我也不提倡在代码中乱扔 SQL 语句,因为这会导致它自己的一系列问题。
我建议使用以下两种方式之一实现 DAL 层。
忘记存储过程。使用 ORM。
【讨论】:
存储过程(不使用动态 SQL 的)可以使整个应用程序更加安全的一种方法是,您现在可以在存储过程级别而不是表级别设置权限。如果您以这种方式进行所有数据访问(并禁止动态 sql!),这意味着用户在任何情况下都不能对不在存储过程中的数据库做任何事情。开发人员总是想说他们的应用程序代码可以抵御外部威胁,但他们似乎忘记了内部威胁通常要严重得多,并且通过允许表级别的权限,他们任由任何能找到方法的用户摆布直接在应用程序外部查询数据库(另一个原因是大商店最多只有两三个人对数据库中的任何内容有生产权限,这限制了谁可以窃取信息)。
例如,使用除存储过程之外的任何东西的任何财务系统都完全容易发生内部欺诈,这违反了应防止欺诈的内部控制,并且不会通过良好的审计。
【讨论】:
存储过程允许您将 sql 代码存储在应用程序之外的位置。这使您能够:
存储过程可以防止注入攻击吗?多半是对的。在 sql server 中,您可以创建对此无效的存储过程,主要是使用 sp_executesql。现在这并不是说 sp_executesql 是一个安全漏洞,它只是意味着在使用它时需要采取更多的预防措施。
这也不意味着存储过程是防止这种情况的唯一方法。您可以使用参数化 sql 来完成防止 sql 注入的相同任务。
我确实同意其他人的看法,存储过程可能很麻烦,但它们也有其优点。在我工作的地方,由于各种原因(不要问),我们可能有 20 个不同的生产数据库。我的工作可能只有三个,我和我的队友非常了解这三个。存储过程如何帮助我们?人们来找我们,当他们需要从这些数据库中获取信息时,我们可以为他们获取信息。我们不必花费数小时来解释模式和非规范化的数据。这是一个抽象层,它允许我们针对我们知道的数据库编写最有效的代码。如果您不是这种情况,那么存储过程可能不是可行的方法,但在某些情况下它们可以增加很多价值。
【讨论】: