3

사용자 입력을 제대로 처리하지 못하는 일부 레거시 코드를 업데이트하려고합니다. 코드는 최소한의 위생 처리를 수행하지만 알려진 모든 위협을 다루지는 않습니다.입력 된 새 니타 이징 및 매개 변수화 된 쿼리는 상호 배타적입니까?

새 코드는 매개 변수가있는 쿼리를 사용합니다. 내가 이해 하듯이, 쿼리는 미리 컴파일되고 입력은 단순히 실행될 수없는 데이터로 취급됩니다. 이 경우 위생 처리가 필요하지 않습니다. 그게 맞습니까?

다른 말로하면,이 레거시 코드에서 쿼리를 매개 변수화하면 현재 수행중인 위생 처리를 제거해도 괜찮습니까? 아니면 매개 변수화에 더하여 위생 처리의 추가 이점을 놓치고 있습니까?

답변

5

SQL 쿼리 매개 변수는 SQL 주입에 대한 훌륭한 방어 수단입니다. 삽입 된 따옴표 또는 다른 특수 문자는 장난을 만들 수 없습니다.

그러나 SQL 쿼리의 일부 구성 요소는 매개 변수화 할 수 없습니다. 예 : 테이블 이름, 열 이름, SQL 키워드

$sql = "SELECT * FROM MyTable ORDER BY {$columnname} {$ASC_or_DESC}"; 

따라서 SQL 쿼리로 삽입하기 전에 유효성을 검사해야하는 동적 내용의 몇 가지 예가 있습니다. 화이트 리스팅 값도 좋은 기술입니다.

또한 열의 데이터 형식에서 허용되지만 무의미한 값을 가질 수 있습니다. 이러한 경우 SQL 문에서 유효성을 검사하는 것보다 유효성 검사에 응용 프로그램 코드를 사용하는 것이 더 쉽습니다.

  • 신용 카드 번호를 저장한다고 가정합니다. 신용 카드 번호에는 유효한 패턴이 있으며, 라이브러리는 유효하지 않은 카드의 유효한 패턴을 인식합니다.

  • 또는 사용자가 암호를 정의하는 방법은 어떻습니까? 충분한 암호 강도를 확인하거나 사용자가 두 개의 암호 입력 필드에 동일한 문자열을 입력했는지 확인해야 할 수 있습니다.

  • 또는 상품 수량을 주문한 경우 수량을 정수로 저장해야하지만 0보다 큰지 확인하고 1000보다 큰 경우 두 배로하고 싶을 수도 있습니다. 사용자가 올바르게 입력했는지 확인하십시오.

+0

그 $ columnname과 $ ASC_OR_DESC가 사용자에게서 오지 않았 으면합니다. 이것들은 코드에서 하드 상수 여야하며 상수에서 변수, SQL에 이르기까지 데이터 경로에 대한 전체 감사를 수행하여 변수 중 하나인지 확인해야합니다. (경로가 매우 짧은 경우 더 쉽기 때문에 매우 낮은 수준의 매개 변수 일 뿐이며 즉각적으로 높은 수준에서 SQL 코드로 끝나는 매개 변수가없는 다른 함수 호출이어야 함) – Javier

+0

@Javier : 그렇지 않습니다. 사용자가 열 머리글을 클릭하여 해당 열을 기준으로 정렬 할 수 있도록하는 일반적인 UI 기능은 무엇입니까? 그러나 네, 당신은 UI 입력이 화이트리스트 또는 어떤 종류의지도를 사용하여 열 이름과 일치하는지 확인하고 싶을 것입니다. UI의 값은 열의 리터럴 이름 일 필요는 없으며 코드가 유효한 열 이름 목록의 항목에 연결할 수있는 값이 될 수 있습니다. –

2

사이트 간 스크립팅을 방지하고 필드의 올바른 내용 (전화 번호의 이름 없음)을 원한다는 것을 비롯하여 여러 가지 이유로 위생 및 유효성을 검사해야합니다. 매개 변수화 된 쿼리를 사용하면 SQL 주입에 대해 수동으로 위생 또는 이스케이프 처리 할 필요가 없습니다.

my previous answers 중 하나를 참조하십시오.

+0

다른 말로하면, 위생 처리는 SQL 주입과 관련이없는 다른 이유로 유용 할 수 있습니다. –

+0

예, @ aardvark. –

1

올바른 SQL 매개 변수는 실행 코드가 아니므로 걱정할 필요가 없습니다.

그러나 여전히 유효성 검사를 수행해야합니다. 예를 들어 varchar (10)가 필요하고 사용자가 그보다 긴 값을 입력하면 예외가 발생합니다.

5

매개 변수화 된 쿼리는 SQL 주입을 방지하는 데 도움이되지만 크로스 사이트 스크립팅에 맞지 않습니다. 이를 방지하려면 HTML 인코딩이나 HTML 탐지/유효성 검사와 같은 다른 방법이 필요합니다. SQL 인젝션 만 신경 쓰면 매개 변수가있는 쿼리로 충분할 것입니다.

1

짧은 번호.입력 삭제 및 매개 변수화 된 쿼리의 사용은 상호 배타적이지 않으며 독립적입니다. 둘 중 하나만 사용하거나 둘 다 사용할 수 없습니다. 그들은 다양한 유형의 공격을 방지합니다. 둘 다 사용하는 것이 가장 좋은 방법입니다.

1

동적 SQL을 포함하는 저장 프로 시저를 작성하는 것이 유용한 경우가 있음을 유의하십시오. 이 경우 입력이 매개 변수화되었다는 사실은 SQL 삽입에 대한 자동 방어가 아닙니다. 이것은 상당히 분명한 점으로 보일지 모르지만, 나는 종종 입력이 매개 변수화되어 SQL 인젝션에 대한 걱정을 멈출 수 있다고 생각하는 사람들을 만난다.