2010-03-04 1 views
8

가능한 중복 :
Can I protect against SQL Injection by escaping single-quote and surrounding user input with single-quotes?이 SQL 쿼리 코드는 사용자 입력에 의해 어떻게 손상/악용 될 수 있습니까?

우리는 위치 매개 변수를 사용하여 쿼리를하지 않는 레거시 응용 프로그램을 가지고 있고, SQL 어디에나있다. 사용자 입력에 아포스트로피가 포함될 수 있기 때문에 모든 문자열 입력을 수동으로 이스케이프 처리해야한다는 결론을 내 렸습니다. 여기

쉽게 소비를위한 C 번호로 변환 (나에 의해 작성되지 않음) 필수 원래의 코드입니다 :

private string _Escape(string input) 
{ 
    return input.Replace("'", "''"); 
} 

private bool _IsValidLogin(string userName, string password) 
{ 
    string sql = 
     string.Format 
     (
      @"SELECT COUNT(*) FROM UserAccounts 
       WHERE UserName = '{0}' AND Password = '{1}'", 
      _Escape(userName), 
      _Escape(password) 
     ); 
    // ... 
}

이 어떤 방법으로 나눌 수 있습니다처럼이 정말 보인다,하지만 난 손실에 있어요 어떻게 사용자 입력에 의해 악용 될 수 있는지에 관한 것입니다. 사용자 입력이 _IsValidLogin에 도달 할 때까지 필터링되지 않는다고 가정하고 암호가 일반 텍스트로 저장되는 것을 잊어 버리십시오.

위치 매개 변수를 사용하여 해결할 수있는 해결책은 분명합니다. 그러나이 코드가 안전하지 않은 이유와 방법을 설명하기 위해 탄약이 필요합니다. 시간/$을 고정시켜 할당 할 수 있습니다.

참고 : 나는 이라고 가정하고이라고 가정합니다. 그러나 실제로는 그렇지 않을 수도 있습니다. 나는 SQL 슈퍼 스타가 아니다.

참고 2 :이 질문은 데이터베이스에 무관심한 것으로 표현했지만 특정 엔진에이 코드를 이용할 수 있다면 기고 물을 환영합니다.

+1

값어치가 있으면 여기를 읽어보십시오. http://stackoverflow.com/questions/139199/can-i-protect-against-sql-injection-by-escaping-single-quote-and- 주변 사용자 –

+0

@ 닉 : 고마워, 나는 그걸 보지 못했다. 나는이 질문을 중복으로 끝낼 것이다. –

+0

작성자의 요청이있을 경우 휴무입니다. –

답변

3

백 슬래시를 사용할 수 있습니다.

password = foo\' OR 1=1 -- 

가된다 :

password = foo\'' OR 1=1 -- 

쿼리 :

"SELECT COUNT(*) FROM UserAccounts 
       WHERE UserName = '{0}' AND Password = 'foo\'' OR 1=1 --'" 

--이 예제의 주석 표시입니다.

이 솔루션에서는 아포스트로피 만 필터링 (복제)한다고 가정합니다.

+0

다른 데이터베이스는 말할 수 없지만 백 슬래시는 MSSQL에서 이스케이프 문자로 보이지 않으며 문자 그대로 사용됩니다. 당신의 예제는''foo \ '또는 1 = 1 --' –

0

글쎄, 나는 그것이 취약한 방법을 볼 수 없습니다. 그래서, 그것이 왜 바뀌어야하는지에 대한 다른 이유를 논증합시다 - 그것은 다소 비효율적입니다. MSSQL (다른 대부분의 하이 엔드 SQL 서버)에서는 쿼리가 구문 분석되고 실행 계획이 고안된 다음 쿼리와 계획이 저장됩니다. 쿼리 exact 복사본을 다시 요청하면 저장된 실행 계획이 사용됩니다. 매개 변수는 영향을 미치지 않으므로 매개 변수를 사용하면 계획이 다시 사용됩니다. 텍스트를 포함하면 절대 안됩니다. http://unixwiz.net/techtips/sql-injection.html

"는 테이블 이름 찾기"를 참조하십시오

+0

의 암호를 검색하는 것일뿐입니다. 취약합니다. 이 예제는 매개 변수 바인딩을 사용하지 않습니다. – erenon

1

이 정말 좋은 기사입니다.