Domanda

Presa in consegna del codice dal mio predecessore e ho trovato una query che utilizza l'operatore Like:

SELEZIONA * DAI fornitori DOVE nome_fattore come '%' + nome +% ';

Cercando di evitare il problema di SQL Injection e di parametrizzare questo, ma non sono sicuro di come questo potrebbe essere realizzato. Qualche suggerimento?

nota, ho bisogno di una soluzione per ADO.NET classico - non ho davvero il diritto di passare questo codice a qualcosa come LINQ.

È stato utile?

Soluzione

prova questo:

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();
}

il framework gestirà automaticamente i problemi di quotazione.

Altri suggerimenti

Parametrizza semplicemente la tua query:

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

Ora puoi passare il tuo " nome " variabile nel parametro @name e la query verrà eseguita senza alcun pericolo di attacchi di iniezione. Anche se passi qualcosa del tipo " '' O true - " funzionerà ancora bene.

In Entity Framework 6 potrebbe essere fatto in questo modo da SQL nativo:

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

o

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

Inoltre, puoi semplicemente utilizzare LINQ to Entities direttamente:

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

Short Anwser:

1) name.Replace (" '" ;, "' '") .... Sostituisci tutti i caratteri di escape che il tuo database potrebbe avere (le virgolette singole sono le più comuni)

2) se stai usando un linguaggio come .net usa le query con parametri

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

Quanto sopra viene sostituito dal seguente

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) Proc memorizzati dall'utente

4) usa Linq to SQL, sempre se stai usando .net

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top