2017-10-20 2 views
1

타사에서 데이터베이스를 읽어서 실행하고 결과를보고하도록 SQL 문자열을 삽입해야합니다. ,최상의 방법으로 sanitize하는 방법

string sql = "SELECT "; 
foreach(KeyValuePair<string, string> field in report.fields) 
{ 
    sql += "[" + field.Key + "] as [" + field.Value + "]; 
} 
sql += " WHERE [email protected]"; 

내가 변수화 할 수 있습니다이 쿼리의 일부분 만 WHERE 절입니다 : 열을 선택할 수 있습니다 사용자가 보고서에 원하기 때문에,뿐만 아니라 열 이름을 변경, 나는이 같은 코드로 종료했습니다 그러나 웹에 대한 나의 연구가 잘못된 것이라면 SELECT 절의 컬럼 이름과 별칭을 매개 변수화할 방법이 없습니다. 자, 프로그램이 작동하는 방식을 바꿀 수 없다는 것을 감안할 때 (제 3 자에게 유효한 SQL 쿼리를 만들어야 만합니다.), 입력 문자열을 삭제하는 가장 좋은 방법은 무엇입니까?

열 이름에 대한 부분을 유효한 열의 목록과 비교하여 해결했지만 알기 쉽습니다. 사용자가 부여 할 수있는 80 자 미만의 문자열 일 수 있습니다. .

+0

이것은 X/Y 질문의 큰 부분입니다. 한 가지 대답은 이것을하지 않고 프로그램 설계를 변경하지 않아도됩니다. – Magisch

+0

또 다른 방법은 영숫자 아스키 문자와 지정된 공백 문자 만 허용 한 다음 문자열을 이스케이프 처리하는 것입니다. – Magisch

+0

"프로그램 작동 방식을 변경할 수 없습니다"라는 부분을 놓쳤습니다. 그것은 당신의 코멘트를 XY 호언 장담의 큰 것으로 만든다. 그런데 두 번째 주석은 더 많은 해결책입니다 ... 정규 표현식에 대한 이름 별칭의 유효한 문자를 제한 할 수 있습니다. 나는 그것을 생각할 것이다. – Rekesoft

답변

1

그렇기 때문에 SQL 레이아웃이 있으므로 변경할 필요가 없습니다. 그것은 불행한 일이지만, 최선을 다할 수 있습니다.

의견에 진술 한대로 일부 특수 문자를 지원해야하므로 이러한 특수 문자를 특별히 이스케이프 처리해야합니다.

그 외의 경우 허용되는 이름을 영숫자 및 공백으로 줄여야합니다. 이들의 유효성 확인 메커니즘 (예 : regex)에 대한 유효성을 검사하고 해당 문자 만 허용하십시오. 아마도 SQL 인젝션으로부터 당신을 보호 할 수있을 것입니다.

이것은 최적은 아니지만이 상황에서 최선을 다하는 것으로 보입니다.

1

언급했듯이 열 이름과 별칭을 매개 변수화 할 방법이 없습니다. 따라서 SQL 인젝션을 사용할 수 있습니다. 문제를 최소화하려면 quotename을 사용할 수 있습니다. 이는 현재 사용중인 접근 방식과 유사합니다.

string sql = "SELECT "; 
foreach(KeyValuePair<string, string> field in report.fields) 
{ 
    sql += "quotename(" + field.Key + ") as quotename(" + field.Value + ")"; 
} 
sql += " WHERE [email protected]"; 
+0

예, 제가 지금 사용하고있는 현재 접근법입니다. 사실 QUOTENAME ("+ field.Value.Replace (" ' ","' ") +))"을 사용하고 있지만 아직 확실하지 않습니다. – Rekesoft

+0

좋다. 그렇다면 더 많이 할 수있는 것은별로 없다. –

관련 문제