2008-10-23 9 views
13
내 전임자의 일부 코드를 통해 촬영

나는 LIKE 연산자를 사용하는 쿼리 발견 : 공급 업체 supplier_name '%'+ 이름 + % '등으로Like 연산자로 매개 변수를 사용하여 SQL 쿼리에서 SQL 삽입을 피할 수 있습니까?

SELECT *을;를

SQL 주입 문제를 피하고이를 매개 변수화하려고 시도했지만 어떻게 수행 될지 잘 모르겠습니다. 어떤 제안?

참고, 고전 ADO.NET에 대한 솔루션이 필요합니다. LINQ와 같은 코드로이 코드를 전환 할 준비가되어 있지 않습니다.

답변

17

.NET

를 사용하고 다시 경우

3) 사용자가 저장 발동

4

)이 시도, SQL Linq에 사용합니다.

엔티티 프레임 워크 (6)에서
+0

고마워요! 답변으로 작업 코드 스 니펫을 얻으려면 좋습니다. 나는 쿼리 텍스트에서 {0}을 고수하려고했다. – MikeJ

8

는 단순히 쿼리를 매개 변수화 :

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

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

-5

짧은 Anwser :

1) name.Replace (" '", "' '") ....

) 가장 보편적 인 이스케이프 데이터베이스가 가질 수있는 문자 (작은 따옴표를 교체

당신이 그물이

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

을 매개 변수화 된 쿼리를 사용하여 같은 언어를 사용하는 경우 2) 위의

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 
아래로 대체됩니다

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

프레임 워크가 자동으로 인용 문제를 다루는 것입니다 : 당신이

+0

을 나는 왜 아래의 모든 표결이 ... 나는 옵션의 범위와 무엇이 가능했는지 보지 못했다. 개인적으로 나는 옵션 1을 사용하지 않을 것이지만 모든 문자가 작은 따옴표가 아닌 이스케이프되어야한다고 말했습니다. 완료되면 완벽하게 유효합니다. 옵션은 거기에서 더 좋아집니다. 사람들은 이유를 밝히지 않고 투표를해서는 안됩니다. – vdhant

+0

vdhant, 질문에 대답하지 않았습니다. 초기 질문은 Like 연산자로 매개 변수화 된 쿼리를 사용하는 방법에 중점을두고 있었고 사용자가 대답에 Like 연산자를 전혀 언급하지 않았습니다. – CodeThug

0

가 네이티브 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();