Pergunta

Assumindo algum código do meu antecessor e eu achei uma consulta que usa o operador Like:

* SELECT FROM fornecedores ONDE supplier_name como '%' + nome +% ';

Tentando evitar problema de SQL Injection e parametrizar isso, mas eu não estou muito certo como isso seria feito. Alguma sugestão?

nota, eu preciso de uma solução para ADO.NET clássico - Eu realmente não têm o sinal verde para mudar esse código sobre a algo como LINQ

.
Foi útil?

Solução

tente o seguinte:

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

quadro irá lidar automaticamente com as questões citando.

Outras dicas

Basta parametrizar sua consulta:

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

Agora você pode passar a variável "nome" para o parâmetro @ nome ea consulta será executado sem qualquer perigo de ataques de injeção. Mesmo se você passar em algo como " '' ou verdadeiro -" Vai ainda funcionam bem

.

Em Entity Framework 6 poderia ser feito assim por Native SQL:

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

Além disso, você pode simplesmente usar o LINQ to Entities diretamente:

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

Curto anwser:

1) name.Replace ( "'", " ''") .... Substitua quaisquer caracteres de escape que seu banco de dados pode ter (aspas simples são os mais comuns)

2) se você estiver usando uma linguagem como uso .net consultas parametrizadas

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

A descrição acima é substituído com o abaixo

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) Armazenado usuário procs

4) usar LINQ to SQL, novamente, se você estiver usando .net

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top