2008-10-23 8 views
13

La prise en charge du code de mon prédécesseur et j'ai trouvé une requête qui utilise l'opérateur comme:Comment éviter l'injection SQL dans une requête SQL avec l'opérateur Like à l'aide de paramètres?

SELECT * FROM fournisseurs OU Nom_fournisseur comme « % » + nom +% ';

Essayez d'éviter le problème d'injection SQL et paramétrez-le, mais je ne suis pas tout à fait sûr de la façon dont cela serait accompli. Aucune suggestion ?

note, j'ai besoin d'une solution pour ADO.NET classique - je n'ai pas vraiment le feu vert pour passer ce code à quelque chose comme LINQ.

Répondre

17

essayez ceci:

var query = "select * from foo where name like @searchterm"; 
using (var command = new SqlCommand(query, connection)) 
{ 
    command.Parameters.AddWithValue("@searchterm", String.Format("%{0}%", searchTerm)); 
    var result = command.ExecuteReader(); 
} 

le cadre traitera automatiquement les problèmes citant.

+0

Merci! Heureux d'obtenir un extrait de code de travail en guise de réponse. J'étais coincé sur le {0} dans le texte de la requête. – MikeJ

8

paramétrons simplement votre demande:

SELECT * FROM suppliers WHERE supplier_name like '%' + @name + '%' 

Vous pouvez maintenant transmettre votre variable « name » dans le paramètre @name et la requête exécutera sans aucun danger d'attaques par injection. Même si vous passez quelque chose comme "'' OU vrai -" ça fonctionnera toujours bien.

-5

court anwser:

1) name.Replace ("'", " ''") .... Remplacer les caractères d'échappement que votre base de données peut avoir (des guillemets simples étant les plus courants)

2) si vous utilisez un langage comme .net utiliser requêtes paramétrées

sql="Insert into Employees (Firstname, Lastname, City, State, Zip, Phone, Email) Values ('" & frmFirstname.text & "', '" & frmLastName & "', '" & frmCity & "', '" & frmState & "', '" & frmZip & "', '" & frmPhone & "', '" & frmEmail & "')" 

le remplacé par passe au-dessus du dessous

Dim MySQL as string = "Insert into NewEmp (fname, LName, Address, City, State, Postalcode, Phone, Email) Values (@Firstname, @LastName, @Address, @City, @State, @Postalcode, @Phone, @Email)" 

With cmd.Parameters: 
    .Add(New SQLParameter("@Firstname", frmFname.text)) 
    .Add(New SQLParameter("@LastName", frmLname.text)) 
    .Add(New SQLParameter("@Address", frmAddress.text)) 
    .Add(New SQLParameter("@City", frmCity.text)) 
    .Add(New SQLParameter("@state", frmState.text)) 
    .Add(New SQLParameter("@Postalcode", frmPostalCode.Text)) 
    .Add(New SQLParameter("@Phone", frmPhone.text)) 
    .Add(New SQLParameter("@email", frmemail.text)) 
end with 

3) utilisateur stockées procs

4) utiliser LINQ to SQL, encore une fois si vous utilisez .net

+0

Je ne vois pas pourquoi tous les votes ici ... J'ai montré la gamme d'options et ce qui était disponible. Personnellement, je n'utiliserais pas l'option 1, mais j'ai dit que tous les caractères auraient besoin d'être échappés, pas seulement les guillemets simples. Si c'est fait, c'est parfaitement valide. Les options ne font que s'améliorer à partir de là. Les gens ne devraient pas voter sans dire pourquoi. – vdhant

+0

vdhant, vous n'avez pas répondu à la question. La question initiale était centrée sur l'utilisation de requêtes paramétrées avec l'opérateur Like, et vous ne mentionnez pas du tout l'opérateur Like dans votre réponse. – CodeThug

0

Dans Entity Framework 6, il pourrait être fait comme ceci par SQL natif:

List<Person> peopleList = contex.People.SqlQuery(
    @"SELECT * FROM [Person].[Person] 
     WHERE [FirstName] LIKE N'%' + @p0 + '%' ", "ab").ToList(); 

Ou

List<Person> peopleList = contex.People.SqlQuery(
    @"SELECT * FROM [Person].[Person] 
     WHERE [FirstName] LIKE N'%' + @name + '%' ", 
    new SqlParameter("@name", "ab")).ToList(); 

En outre, vous pouvez simplement utiliser LINQ aux entités directement:

List<Person> peopleList1 = contex.People.Where(s => s.FirstName.Contains("ab")).ToList(); 
Questions connexes