2013-01-05 6 views
3

LIKE 문을 사용하여 SQL 주입을 중단하는 가장 좋은 방법은 무엇입니까?SQL 삽입 및 LIKE 문

string search = Server.HTMLDecode(userEnteredSearchText); 
SqlCommand comm = new SqlCommand("SELECT Result WHERE (Keyword LIKE '%" + @search + "%') " 
comm.Parameters.Add(new SqlParameter("search", search)); 

이 내가 다른 SQL 문을하고있다 그리고 그 문을 깰 수없는 등 '% 같은 특수 문자 것 같아,하지만 난으로 추측하고있어 무엇인가 : 그래서 여기에 코드의 예입니다 LIKE 성명서에 이스케이프 키 또는 다른 것을해야합니까?

+0

[LIKE 연산자는 매개 변수를 사용하여 SQL 쿼리에서 SQL 주입을 방지?]의 중복 가능성 (http://stackoverflow.com/questions/228476/avoiding-sql-injection-in-sql-query-with- like-operator-using-parameters) – oleksii

답변

2

죄송합니다. 따옴표는 사용하지 않습니다. 당신은 내에서 %을 연결하는 데 필요한 SQL을 제외하고는 다른 모든 작업과 똑같이 수행합니다. 또한, HTMLDecode은 아마 당신을 전혀 여기에서 좋게하지 않을 것입니다, 그렇죠? 그들이 당신의 예에 따라서 "&"

Search = userEnteredSearchText); 

SqlCommand comm = new SqlCommand("SELECT Result WHERE Keyword LIKE '%' + @search + '%'"); 
comm.Parameters.Add(new SqlParameter("search", search)); 

를 포함하는 것들에 대한 DB에 검색 할 경우 어떻게, 당신은 잘못된 키워드 또는 변수입니다 @search에 넣어 리터럴 SQL을 폐쇄했다 - 당신은 그냥 떠날 필요 SQL 문 내에서. 다른 DB들은 CONCAT 함께해야합니다. 그러나 바인드 변수는 드라이버로가는 물건을 제대로 벗어날 것입니다.

+0

좋은 감사! HTMLDecode 주석은 무엇을 의미합니까? 그래서 항상 브라우저에서 서버로 텍스트를 가져올 때 HTMLDecode를 사용해야하고 서버에서 브라우저로 텍스트를 전송할 때 HTMLEncode를 사용해야한다고 생각했습니다. – Kevin

+1

표준 메소드를 사용하여 요청에서 데이터를 얻으면 이미 HTTP (HTML이 아닌)가 디코딩됩니다. HTML 디코드는 HTML 인코딩을 제거하기위한 것이므로 '&'과 같은 것들은'&'로 다시 번역됩니다. 그러나 정상적인 상황에서는 사용자의 데이터가 HTML로 인코딩 된 곳이 없습니다. 예 - 동적 데이터를 다시 보낼 때 HTML 인코딩해야하지만 데이터를받을 때는 HTML로 인코딩되지 않습니다. – Colselaw

-1

데이터베이스에 SQL 쿼리를 보낼 때 매개 변수에서 작은 따옴표를 사용하지 마십시오. C# 코드 자체의 매개 변수에있는 특수 문자를 제거하십시오. 가능한 한 많은 특수 문자를 사용하지 않는 것이 좋습니다.

+0

Downvote는 매개 변수를 사용하는 한 가지 목적이 특수 문자의 문제를 제거하기위한 것이기 때문입니다. –

4

다음은 나에게 조금 더 깨끗해 보입니다.

string search = Server.HTMLDecode(userEnteredSearchText); 
SqlCommand comm = new SqlCommand("SELECT Result WHERE (Keyword LIKE @search) " 
comm.Parameters.Add(new SqlParameter("search", String.Format("%{0}%", search))); 
+0

좋은 제안! – Kevin