存储过程是否有助于消除SQL注入/应用程序中存储过程优于普通SQL语句的好处是什么?

nat*_*h3z 10 sql database stored-procedures

我对SQL世界很陌生.这是我的问题:

  • 在应用程序中,存储过程优于普通SQL语句有什么好处?
  • 存储过程是否有助于消除SQL注入?
  • 在Microsoft SQL Server中,它称为存储过程.在Oracle,MySQL,DB2等中怎么样?

谢谢你的解释.

Joe*_*orn 7

如果以参数化方式调用它们,则存储过程仅直接阻止SQL注入.如果你的应用程序中仍然有一个带有过程名称的字符串,并且在用户输入中将参数连接到代码中的字符串,那么你仍然会遇到麻烦.

但是,当专门使用时,存储过程允许您添加一些额外的保护,使您可以禁用除EXEC命令之外的所有内容的权限.除此之外,参数化查询/预处理语句通常由服务器缓存,因此几乎在所有方面都像存储过程一样.

尽管如此,存储过程对于大型企业来说有两大优势:

  • 它们允许您为数据库定义应用程序接口,以便可以在多个应用程序之间共享系统,而无需在这些应用程序中复制逻辑.
  • 他们将sql代码移动到db,在那里您可以轻松地进行经验丰富的DBA调优,更新和维护,而不是通常不知道他们正在使用数据库代码做什么的应用程序开发人员.

当然,这些优势并非没有代价:

  • 跟踪源控件的变化更加困难
  • 数据库代码与使用它的代码分开很远
  • 用于管理许多存储过程的开发人员工具不太理想(如果您曾经在管理工作室中打开存储过程文件夹来查找数据库的200个过程,那么您知道我在这里谈论的内容).


Sco*_*vey 6

我在使用存储过程时考虑的一些好处

  • 存储过程将查询代码封装在服务器上,而不是在应用程序内部.这使您可以更改查询,而无需重新编译应用程序.
  • 存储过程可用于更明确的应用程序安全性.您可以拒绝基表的所有权限,仅在procs上授予执行权限.这为您提供了更小的安全性管理.
  • 存储过程是编译代码.使用最新版本的MSSQL,服务器可以更好地存储执行计划 - 所以这不像以前那么大,但仍有待考虑
  • 只有正确使用时,存储过程才能消除SQL注入风险.确保在存储过程中以正确的方式使用参数 - 存储的过程只是在它们内部执行连接的动态SQL并没有任何好处.