Éviter l'injection SQL dans une requête SQL avec l'opérateur similaire à l'aide de paramètres?

StackOverflow https://stackoverflow.com/questions/228476

Question

Reprenant du code de mon prédécesseur, j'ai trouvé une requête qui utilise l'opérateur Like:

SELECT * FROM fournisseurs WHERE nom_fournisseur tel que '%' + nom +% ';

Essayer d'éviter le problème d'injection SQL et de le paramétrer mais je ne suis pas tout à fait sûr de savoir comment cela serait accompli. Des suggestions?

remarque, 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.

Était-ce utile?

La solution

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 de citation.

Autres conseils

Paramétrez simplement votre requête:

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

Vous pouvez maintenant transmettre votre " nom " variable dans le paramètre @name et la requête s'exécutera sans aucun risque d'attaque par injection. Même si vous transmettez quelque chose du genre "OU OUI -" ça va quand même bien fonctionner.

Dans Entity Framework 6, cela pourrait être fait comme cela 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();

De plus, vous pouvez simplement utiliser LINQ to Entities directement:

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

Réponse courte:

1) name.Replace ("" "," "" "...). Remplacez les caractères d'échappement éventuellement utilisés par votre base de données (les guillemets simples étant les plus courants)

2) si vous utilisez un langage tel que .net, utilisez les 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 & "')"

Ce qui précède est remplacé par ce qui suit

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é procs

4) utilisez Linq to SQL, à nouveau si vous utilisez .net

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top