매개 변수를 사용하여 동작자와 함께 SQL 쿼리에서 SQL 주입을 피하십시오.

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

문제

전임자로부터 일부 코드를 인수하면 Like 연산자를 사용하는 쿼리를 찾았습니다.

'%'+name+%'와 같은 Supplier_name이있는 공급 업체에서 *를 선택하십시오.

SQL 주입 문제를 피하고이를 매개 변수화하려고하지만 이것이 어떻게 달성 될지 잘 모르겠습니다. 제안이 있습니까?

Classic Ado.net을위한 솔루션이 필요합니다.이 코드를 LINQ와 같은 것으로 전환 할 수있는 것은 없습니다.

도움이 되었습니까?

해결책

이 시도:

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

프레임 워크는 인용 문제를 자동으로 처리합니다.

다른 팁

간단히 매개 변수화 :

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

이제 "이름"변수를 @Name 매개 변수로 전달할 수 있으며 쿼리는 주입 공격의 위험없이 실행됩니다. " '또는 True와 같은 것을 통과하더라도 여전히 잘 작동합니다.

엔티티 프레임 워크 6에서는 기본 SQL에 의해 이와 같이 수행 될 수 있습니다.

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

또는

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

또한 LINQ를 엔터티에 직접 사용하면 다음과 같습니다.

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

짧은 Anwser :

1) name.replace ( " '", "' '") .... 데이터베이스가 가질 수있는 탈출 문자를 교체하십시오 (단일 따옴표가 가장 흔합니다)

2) .net과 같은 언어를 사용하는 경우 매개 변수화 쿼리를 사용하십시오.

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

위는 아래로 대체됩니다

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) 사용자 저장 Procs

4) .NET를 사용하는 경우 LINQ에서 SQL을 사용하십시오.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top