在 Laravel 中调用接收参数的存储过程时,我见过两种语法,它们都可以完美运行:
//Concatenando parametro
DB::select('exec Miprocedimiento "'.$parametro.'"');
//Utilizando ?
DB::select('exec Miprocedimiento ?', array($parametro));
正确的做法是什么?在性能、安全性方面有什么区别吗?
在 Laravel 中调用接收参数的存储过程时,我见过两种语法,它们都可以完美运行:
//Concatenando parametro
DB::select('exec Miprocedimiento "'.$parametro.'"');
//Utilizando ?
DB::select('exec Miprocedimiento ?', array($parametro));
正确的做法是什么?在性能、安全性方面有什么区别吗?
在性能方面,这两个选项是等效的。
但不是在安全方面。
通常,在编写要由数据库引擎解释的命令时,应采取预防措施以防止应用程序用户的攻击,例如SQL 注入。
为此,最好尽可能使用参数,而不是连接文本,减少用户输入的文本,作为 SQL 语句的一部分(不仅用于执行存储过程,而且通常用于执行存储过程)。
因此,您在问题中包含的第二种形式比第一种更值得推荐。
好吧,引擎将解释的文本将是 only
'exec Miprocedimiento ?'
,明确定义了$parametro
在调用 时必须完整传递的值Miprocedimiento
。相反,使用第一个选项:
例如,如果用户设法操纵变量
$parametro
以获取文本,则存在风险:引擎将收到的文本,即串联的产物,将是:
存在最终破坏数据库中信息的风险。
有一些例程可以清理用户输入的文本,但这永远不会像使用参数那样有效。
如果你想这样做:
你可以像这样使用双引号
不连接......虽然不建议这样做,因为您容易受到 sql 注入攻击......正确的事情是
但如果您的程序有两个以上的参数,建议这样做
比第一个更推荐。