2010-05-05 2 views
4

여기에 약간의 상황이 있습니다. 나는 전체적으로 많은 위생 처리/매개 변수화를 수행하지 않는 상거래 서버로 작업하고 있습니다.매개 변수화 된 쿼리/쿼리 없음/사용하지 않음

SQL 삽입을 방지하기 위해 쿼리를 작성하려고하지만 검색 개체의 where/where 절이 필요합니다. 매개 변수화 된 인터페이스가 없습니다.

기본적으로 매개 변수화 할 수 없지만 가능하면 동일한 엔진을 사용하여 쿼리 텍스트를 작성할 수 있기를 바랍니다. 아마도 매개 변수가있는 쿼리만큼 좋지는 않은 자체 매개 변수 엔진을 작성하는 것 외에는이를 수행 할 수있는 방법이 있습니까?

업데이트 : 그러나 우리가했습니다 당신이 검색을 구체화하는 방법을 예 위

CatalogSearch search = /// Create Search object from commerce server search.WhereClause = string.Format("[cy_list_price] > {0} AND [Hide] is not NULL AND [DateOfIntroduction] BETWEEN '{1}' AND '{2}'", 12.99m, DateTime.Now.AddDays(-2), DateTime.Now); 

*이

: 예 절은 본질적으로 절은 SQL 쿼리로 구축 될 수있다

일부 테스트를 마쳤습니다.이 문자열은 NOT SANITIZED입니다.

.Format의 모든 입력이 사용자 입력이 될 수 있고 텍스트 상자에서 입력을 쉽게 정리할 수 있기 때문에 이것이 내 문제의 원인입니다. 가장자리의 경우를 놓치지 않을 것입니다. 사물의 본질. Commerce Server에는 확장 가능한 필드 집합 (스키마) 집합을 처리하는 방법에있어 약간의 미숙 한 논리가 있기 때문에 매개 변수가있는 쿼리를 사용하는 옵션이 없습니다. & 자유 텍스트 검색 단어가 미리 컴파일되어 있습니다. 의 라인을 따라 뭔가 이 내가

내가했던 것과/사랑이/볼 수있는 SQL 테이블에 직접 갈 수없는 의미입니다 :

SqlCommand cmd = new SqlCommand("[cy_list_price] > @MinPrice AND [DateOfIntroduction] BETWEEN @StartDate AND @EndDate"); 
cmd.Parameters.AddWithValue("@MinPrice", 12.99m); 
cmd.Parameters.AddWithValue("@StartDate", DateTime.Now.AddDays(-2)); 
cmd.Parameters.AddWithValue("@EndDate", DateTime.Now); 

CatalogSearch search = /// constructor 
search.WhereClause = cmd.ToSqlString(); 
+0

(시나리오를 강조하는 것이 좋으며 왜 매개 변수를 사용할 수 없습니까? 감사합니다) –

+1

이 작업을 수행하는 방법에 대한 예를 들려 줄 수 있습니까? –

답변

1

그것은 당신이 오래된 학교를 가야 할 것 같은데 쿼리를 구성하기 전에 직접 데이터의 유효성을 검사하십시오. 나는 .NET 사람 아니에요하지만 CGI의 세계에서 내가 좋아하는 뭔가 입력을 살균 것입니다 : 내가 생각할 여전히 와일드 카드를 허용 할 수있는 SQL 주입을 방해합니다

$foo =~ s/[^a-zA-Z0-9*%]//g 

. 문제는 정규식이 비싸다는 것입니다.

관련 문제