2011-10-12 2 views
2

SQL 주입을 방지하기 위해 SQL 매개 변수를 프로젝트에 적용하고 있습니다.SQL 매개 변수 - 사용 위치

사용자 개입이없는 쿼리를 비롯하여 응용 프로그램의 모든 쿼리에 매개 변수를 추가합니까?

예를 들어, 내 사용자가 키워드를 검색하고 텍스트 필드를 제출 한 경우. 그 키워드를 사용하는 쿼리에 매개 변수화 된 메서드를 추가하여 사용자가 무언가를 추가하는 것을 막습니다. 그러나이 쿼리 아래에는 최상위 검색에서 키워드 ID를 가져 와서 다른 위치에서 자체 쿼리를 실행하는 또 다른 쿼리가 있습니다.

이것은 혼란 스럽습니다. 키워드 ID가 사용자가 아니더라도 매개 변수 방법을이 쿼리에도 추가합니까?

많은 감사

+0

자리 표시자를 일관되게 사용하십시오 (모든 곳에서 읽음). 감사! :) –

답변

5

예, 당신은 매개 변수가 어떤 장소에서 매개 변수화 된 쿼리를 사용합니다.

오늘 특정 검색어에 사용자 입력이 사용되지 않는다고해서 내일은 동일하지 않습니다. 코드가 변경되었습니다. 아마도 악의적 인 사용자가 첫 번째 쿼리를 손상시킨 다음 두 번째 쿼리를 손상시키는 방법을 알아낼 것입니다.

defense in depth에 대해 생각해보십시오.

+0

+1 "매개 변수가있는 모든 위치에서 매개 변수가있는 쿼리를 사용하십시오." –

+2

여기에 Jeff Atwood가 있습니다. http://www.codinghorror.com/blog/2005/04/give-me-parameterized-sql-or-give-me-death.html – Rikon

+0

+1 Jeff, 흥미로운 기사 – TheCarver

2

네, 매개 변수 여야합니다. 그렇지 않으면 db에 삽입 한 값을 사용자가 입력했는지 추적해야합니다. ''DROP DATABASE '의 이름을 막을 수있는 방법은 없습니다. 데이터베이스의 데이터를 맹목적으로 신뢰할 수 있다면 위생적으로 처리해야하지만 어느 시점에서는 잘못 처리해야합니다. 같은

뭔가 : 당신의 SQL 엔진이 내부적으로 매개 변수를 사용하기 때문에

SELECT Rows FROM TABLE2 WHERE KeywordId = (
    SELECT KeywordId FROM TABLE1 WHERE UserInput = @u 
) 

이 확인 될 것입니다. 응용 프로그램이 외부 변수 입력 매개 변수를 사용하지 않기 때문에 - 잘못된 것

var keywordId = sql_exec("SELECT KeywordId FROM Table1 WHERE UserInput = @u", userInput); 
var rows = sql_exec("SELECT Rows FROM Table2 WHERE KeywordId = '" + keywordId + "'"); 

: 그것은 같은 논리입니다.