어떻게? 매개 변수 및 LIKE 문 SQL


80

저는 검색 기능을 작성 중이며 SQL 주입 공격을 방지하거나 최소한 제한하기 위해 매개 변수를 사용하여이 쿼리를 생각했습니다. 그러나 내 프로그램을 통해 실행할 때 아무것도 반환하지 않습니다.

SELECT * FROM compliance_corner WHERE (body LIKE '%@query%') OR (title LIKE '%@query%')

매개 변수를 이와 같이 사용할 수 있습니까? 또는 다음과 같은 인스턴스에서만 유효합니까?

SELECT * FROM compliance_corner WHERE body LIKE '%<string>%'( <string>검색 개체는 어디에 있습니까 ).

편집 : 나는 VB.NET 으로이 기능을 구성하고 있는데, 당신이 기여한 구문에 영향을 미칩니 까?

또한 SQL Server : SELECT * FROM compliance_corner WHERE (body LIKE '%max%') OR (title LIKE% max % ')` 에서이 문을 실행하면 결과가 반환됩니다.

답변:


78

시각적 기본 코드는 다음과 같습니다.

Dim cmd as New SqlCommand("SELECT * FROM compliance_corner WHERE (body LIKE '%' + @query + '%') OR (title LIKE '%' + @query + '%')")

cmd.Parameters.Add("@query", searchString)

3
Adam이 그의 대답에서 지적했듯이 이것은 SQL 주입으로부터 보호하지 않습니다. 쿼리는 매개 변수화되어야합니다.
DOK

6
이것이 SQL 주입을 방지하지 않는 예를 제공 할 수 있습니까? 내 테스트에서 잘 작동합니다
John

27
SQL주입에 개방되지 않고 주입 만하면 LIKE됩니다. 이것은 사용자가 같은 특수 문자를 입력 할 수 있음을 의미 % ^하고 _있는 LIKE특별하게 해석합니다. 이것은 사용자가 특정 검색에 대해 기대하는 것을 얻지 못할 수 있음을 의미합니다. 예를 들어를 검색 'less than 1% fat'하면 결과가 반환 될 수 있습니다 'less than 1% of doctors recommend this - it's full of fat!'.
Alex Humphrey

1
동의합니다. 좋아요는 "Like Injection"의 대상이되며 사용자가 기대하는 바를 얻지 못하는 경우에만 피해가 발생한다는 데 동의합니다. 매개 변수화 된 경우에도 쿼리 삭제는 항상 수행되어야합니다. 이러한 보호에만 의존하는 것은 정확히 안전하지 않습니다.
앤서니 메이슨

1
나는 또한 searchString.Replace("[","[[]").Replace("%","[%]").Replace("_","[_]")LIKE 주입을 피할 것을 권장 합니다 (이스케이프 절을 사용하지 않는 한).
8DX

114

글쎄, 나는 함께 갈 것입니다.

 Dim cmd as New SqlCommand(
 "SELECT * FROM compliance_corner"_
  + " WHERE (body LIKE @query )"_ 
  + " OR (title LIKE @query)")

 cmd.Parameters.Add("@query", "%" +searchString +"%")

이것은 정확합니다. John이 제공 한 대답에는 잘못된 구문이 있습니다!
Adam

3
그의 구문이 어떻게 잘못되었는지 잘 모르겠습니다. 그의 솔루션은 잘 작동했습니다. 데이터 테이블 또는 다른 모든 항목에서 사용하기 위해 SQL 문을 구성하고 반환하는 함수가 있습니다.
Anders

1
추가 참고 사항 : MySQLDataAdapter를 사용하는 C # 구문 = da = new MySQLDataAdapter ( "SELECT * FROM tableA WHERE fieldA = @fieldA"); da.SelectCommand.Parameters.AddWithValue ( "@ fieldA", "%"+ someValue + "%");
John M

3
다른 답변 (John의)도 작동하지만 실제로는 유사 주입에 취약하며 귀하의 분야의 목적에 따라 이상한 결과를 줄 수 있습니다.
Steven Lemmens 2012 년

1
되는 cmd.Parameters.Add것이 cmdLoad.Parameters.AddWithValue아니거나 문제가 있습니까? 나는 James의 대답이 2008 년에서 나온 것임을 이해합니다. :)
WTFZane

26

너가해야되는:

LIKE '%' + @param + '%'


훌륭한 솔루션-가능하면 +1 이상을 줄 것입니다! 감사합니다
BM

2

% 기호를 매개 변수와 연결해야 할 수 있습니다. 예 :

'%'처럼 || @ 쿼리 || '%'

편집 : 사실, 전혀 말이되지 않을 수도 있습니다. 나는 당신의 문제를 오해 한 것 같습니다.


1

%VB에서 쿼리를 실행하면 MS SQL / Access에서 실행할 때와 같은 경우 자리 표시 자로 사용되는 기호 가 다를 수 있습니다. 자리 표시 자 기호를에서 %로 변경해보십시오 *. 작동 할 수 있습니다.
그러나 디버깅하고 SQL 문자열을 MS SQL 또는 Access에서 직접 복사하여 테스트 %하려면 실제로 값을 반환하기 위해 MS SQL 또는 Access에서 기호를 다시 변경해야 할 수 있습니다 .

도움이 되었기를 바랍니다


2012 년에는 확실하지 않지만이 % 대 *는 ADO 대 DAO 엔진에만 해당됩니다. Access에서 DAO 또는 Current ()를 사용하는 경우 와일드 카드는 *입니다. Access 내부의 VBA를 포함하여 모든 코드에서 ADO를 사용하는 경우 와일드 카드는 %입니다.
Marcelo Scofano Diniz

1

이 방법도 시도

Dim cmd as New SqlCommand("SELECT * FROM compliance_corner WHERE (body LIKE CONCAT('%',@query,'%')  OR  title LIKE CONCAT('%',@query,'%') )")
cmd.Parameters.Add("@query", searchString)
cmd.ExecuteNonQuery()

중고 CONCAT 대신 +

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.