我对SQL世界很陌生。以下是我的问题:
感谢您的解释。
答案 0 :(得分:7)
只有直接存储过程,如果以参数化方式调用它们,则会阻止SQL注入。如果你的应用程序中仍然有一个带有过程名称的字符串,并且在用户输入中将参数连接到代码中的字符串,那么你仍然会遇到麻烦。
但是,当单独使用时,存储过程允许您添加一些额外的保护,使您可以禁用除EXEC命令之外的所有内容的权限。除此之外,参数化查询/预处理语句通常由服务器缓存,因此几乎在所有方面都像存储过程一样。
尽管如此,存储过程对于大型企业来说有两大优势:
当然,这些优势并非没有代价:
答案 1 :(得分:6)
使用存储过程时我考虑的一些好处
答案 2 :(得分:2)
在大多数情况下,使用存储过程,SQL注入的可能性要小得多。虽然有时您希望传递一些存储过程需要在存储过程中使用动态SQL的数据,然后您就回到了开始的位置。从这个意义上说,我认为在支持它们的编程语言中使用参数化查询没有任何优势。
我个人讨厌存储过程。在两个脱节的地方拥有代码是一个痛苦的屁股,它使部署更加复杂。我不主张用SQL语句乱丢你的代码,但这会导致它自己的一系列麻烦。
我建议使用以下两种方式之一实现DAL层。
忘记存储过程。使用ORM。
答案 3 :(得分:0)
存储过程允许您将sql代码存储在应用程序之外的位置。这使您能够:
存储过程是否可以防止注入攻击?多半是对的。在sql server中,您可以创建对此无效的存储过程,主要是使用sp_executesql。现在这并不是主要的sp_executesql是一个安全漏洞,它只是意味着在使用它时需要采取更多的预防措施。
这并不意味着存储过程是防止这种情况的唯一方法。您可以使用parameritized sql来完成防止sql注入的相同任务。
我同意其他人的存储过程可能很麻烦,但他们也有自己的优势。在我工作的地方,由于各种原因,我们可能有20个不同的生产数据库(不要问)。我工作的可能是三个子集,我的队友和我知道这三个真的非常好。存储过程如何帮助我们?人们来找我们,当他们需要从这些数据库中获取信息时,我们可以为他们获取信息。我们不必花费数小时来解释模式以及哪些数据被去规范化。它是一个抽象层,它允许我们针对我们所知道的数据库编写最有效的代码。如果您不是这种情况,那么可能存储过程不是可行的方法,但在某些情况下,它们可以添加很多价值。
答案 4 :(得分:0)
存储过程(不使用动态SQL的过程)可以使整个应用程序更安全的一种方法是,您现在可以在存储过程级别而不是在表级别设置权限。如果你以这种方式访问所有数据(并且禁止动态sql!),这意味着用户在任何情况下都不能对不在存储过程中的数据库做任何事情。开发人员总是想说他们的应用程序代码可以抵御外部威胁,但是他们似乎忘记了内部威胁通常要严重得多,并且通过允许表级别的权限,他们受任何能够找到方法的用户的支配直接在应用程序外查询数据库(另一个原因是,在大型商店中,最多只有两三个人对数据库中的任何内容都拥有生产权限,这限制了谁可以窃取信息)。
任何使用除存储过程之外的任何财务系统的内部欺诈都是完全开放的,这是违反内部控制的行为,应该防止欺诈并且不会通过良好的审计。