2012-05-12 17 views
9

¿Esta consulta es segura contra la inyección sql en combinación con Dapper? Si no, ¿cuál sería la forma correcta de escribirlo en MySql? ¿O hay una versión mejor sin usar concat?Pregunta Dapper LIKE para MySql safe contra Sql Injection?

string sql = "SELECT * from user_profile WHERE FirstName LIKE CONCAT("%",@name,"%");" 
var result = connection.query<profile>(sql, new {name}); 

Respuesta

4

Ésta es segura porque se está construyendo no SQL de forma dinámica en toda. El nombre es solo un parámetro normal. En realidad, no tiene nada que ver con Dapper.

Usar una cadena concat aquí es la elección correcta. Alternativamente, puede usar la función SUBSTRING_INDEX.

15

no hay un problema con ese código, pero otro enfoque es llevar a cabo el el concat a la persona que llama, es decir

const string sql = "SELECT * from user_profile WHERE FirstName LIKE @name;"; 
var result = connection.Query<Profile>(sql, new {name = "%"+name+"%"}); 
+1

Esto funciona, pero proporciona el Sever con menos información sobre la estructura del patrón. No estoy seguro de si esto importa para las búsquedas de subcadenas, pero definitivamente lo hace para las búsquedas de inicio. – usr

+0

@usr sería interesante hacer un perfil de eso. No afecta a otros RDBMS de forma negativa. –

+0

¡Gracias a ambos por sus respuestas! – Epstone