9

He visto dos sintaxis al llamar procedimientos almacenados que reciben parametros en laravel, ambas funcionan perfectamente:

//Concatenando parametro    
DB::select('exec Miprocedimiento "'.$parametro.'"');

//Utilizando ?
DB::select('exec Miprocedimiento ?', array($parametro));

¿Cual es la forma correcta?, ¿existe alguna diferencia en cuanto a rendimiento, seguridad?

7
  • La primera opción faltaría los paréntesis antes de concatenar el valor ?
    – Dev. Joel
    Commented el 11 abr. 2018 a las 15:22
  • Ambas funcionan estimado @Dev.Joel lo que quisiera saber si existe diferencia en cuanto a seguridad, rendimiento, o son exactamente iguales
    – FQuijada
    Commented el 11 abr. 2018 a las 15:24
  • Probó las dos opciones ? Sería bueno añadir la etiqueta SQL :)
    – Dev. Joel
    Commented el 11 abr. 2018 a las 15:58
  • Si las dos las probé, gracias por la sugerencia, ya agregue las etiquetas
    – FQuijada
    Commented el 11 abr. 2018 a las 16:07
  • 4
    La segunda opción es mas segura, para evitar ataques de inyección sql
    – rbjrichy
    Commented el 22 ago. 2018 a las 22:00

3 respuestas 3

3

En cuanto a rendimiento, ambas opciones son equivalentes.

Pero no en cuanto a seguridad.

De manera general, al escribir comandos a ser interpretados por el motor de base de datos, se deben tomar precauciones para evitar ataques de parte de los usuarios de una aplicación, por ejemplo, la inyección SQL.

Para ello, es preferible utilizar, siempre que se pueda, parámetros, y no concatenar textos, menos textos introducidos por el usuario, como parte de una sentencia SQL (no solo para ejecutar procedimientos almacenados, sino en general).

Por esto, la segunda forma que incluyes en tu pregunta, es más recomendable que la primera.

DB::select('exec Miprocedimiento ?', array($parametro));

Pues el texto que el motor interpretará, será solamente 'exec Miprocedimiento ?', quedando explicitamente definido que el valor de $parametro debe luego pasarse de manera integra al invocar Miprocedimiento.

En cambio, con la primera opción:

DB::select('exec Miprocedimiento "'.$parametro.'"');

Existe el riesgo, por ejemplo, si el usuario lograse manipular la variable $parametro para que tenga el texto:

123'; drop Tabla; select '

El texto que el motor recibirá, que es producto de la concatenación, será:

exec Miprocedimiento '123'; drop Tabla; select ''

Existe el riesgo que esto termine destruyendo información en la base de datos.

Hay rutinas para sanitizar el texto introducido por el usuario, pero eso nunca será tan efectivo como el uso de parámetros.

1
DB::select("exec Miprocedimiento :parametro",array( 'parametro'=>$parametro ));   

En Caso de que quieras hacerlo de esta forma:

DB::select('exec Miprocedimiento "'.$parametro.'"');  

Podrias usar las dobles comillas de esta manera

DB::select("exec Miprocedimiento $parametro");

Para no concatenar .. aunque no es recomendable hacerlo de esta manera porque estas vulnerables a los ataques de inyeccion sql .. lo correcto es

DB::select("exec Miprocedimiento :parametro",$parametro);

pero si tu procedimiento tiene mas de 2 parametros lo recomendable es esto

DB::select("exec Miprocedimiento :parametro",array( 'parametro'=>$parametro ));  
-1

es más recomendable que la primera.

DB::select('exec Miprocedimiento ?', array($parametro));
2

¿No es la respuesta que buscas? Examina otras preguntas con la etiqueta o formula tu propia pregunta.