매개 변수를 사용하여 동작자와 함께 SQL 쿼리에서 SQL 주입을 피하십시오.
-
04-07-2019 - |
문제
전임자로부터 일부 코드를 인수하면 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을 사용하십시오.
제휴하지 않습니다 StackOverflow