2010-09-17 3 views

답변

10

아니요, 매개 변수를 사용하여 모든 SQL 주입 공격을 피할 수는 없습니다. 동적 SQL이 중요한 문제이며, 이는 스토어드 프로 시저와 애플리케이션 코드에서 발생할 수 있습니다.

예 : 이것은 SQL 주입 공격을 받기 쉽습니다. 매개 변수가있는 쿼리는 사용자 이름을 저장 프로 시저에 전달하고 저장 프로 시저 내에서 매개 변수는 SQL 명령에 연결되어 실행됩니다.

많은 종류의 SQL 주입 공격에 대한 예는 SQL Injection Cheat Sheet을 참조하십시오. 작은 따옴표를 그냥 이스케이프하는 것은 표면을 긁는 것일 뿐이며 그 주위에는 여러 가지 방법이 있다는 것을 알 수 있습니다.

+0

그래서 해결책은 무엇입니까? –

+0

@MH : 모두 'with'로 바꾸기 –

+0

해결 방법은 동적 SQL을 절대로 사용하지 않는 것입니다. 이것이 가능하지 않다면 극단적 인 길이로 가서 SQL 문에 연결될 문자열을 올바르게 이스케이프 처리하고 문자열이 도메인 전체에 정렬되는 방식을 고려해야합니다 (예 : HTML -> Javascript - -> URL 인코딩 ->), 이러한 변환으로 인해 추가로 복잡 할 수 있습니다. – RedFilter

2

이러한 매개 변수 (예 : 저장 프로 시저에 전달됨)를 사용하여 동적 SQL 쿼리를 작성하려는 경우 예방 조치가 취해지지 않으면 SQL 주입 가능성이 있습니다.

9

예 아니요. 예, 모든 SQL 문이 실제로 정적이며 매개 변수 만 사용하는 경우 SQL 주입 공격으로부터 100 % 보호됩니다.

매개 변수 자체가 동적 SQL 문을 구성하는 데 사용되는 경우 문제가 발생합니다. 하나의 모 놀리 식 문장이 비현실적인 여러 옵션을 쿼리하기 위해 동적으로 SQL 문을 생성하는 저장 프로 시저가 그 예입니다. 이 문제에 대한 더 나은 해결책이 있지만, 일반적인 문제입니다.

+0

100 %, 즉 MS 또는 Novell이 실수하지 않았다고 가정합니다. –

1

데이터베이스 엔진이 지원하는 경우 준비된 문을 사용하여 SQL 주입 위험을 최소화 할 수 있습니다.

어쨌든 prepared statements는 아마도 SQL 주입을 차단하는 가장 안전한 방법 일 것입니다.

5

예 그렇습니다. 매개 변수를 사용하여 모든 SQL-injection 공격을 피할 수 있습니다. 매개 변수를 까지만 호출하면 호출 스택까지 내려갈 수 있습니다. 예 :

  • 응용 프로그램 코드는 데이터베이스에서 저장 프로 시저 또는 동적 SQL을 호출합니다. 매개 변수를 사용하여 모든 값을 전달해야합니다.
  • 저장 프로 시저 또는 동적 SQL은 다른 저장 프로 시저 또는 동적 SQL 문에 대한 호출을 내부적으로 생성합니다. 또한 매개 변수를 사용하여 모든 값을 전달해야합니다.
  • 코드가 다 떨어질 때까지 ad-infinitum을 반복하십시오.

SQL Server에서 프로그래밍하는 경우 sp_executesql을 사용하여 동적 SQL을 실행할 수 있으며 매개 변수화 된 값을 정의하고 실행중인 문으로 전달할 수 있습니다.

+0

+1 사람들은 동적 SQL에서 매개 변수를 사용할 수 있다는 사실을 잊어 버린 것 같습니다. – dotjoe

1

문제는 동적으로 SQL 문을 작성하는 것입니다.

예를 들어 사용자가 선택한 열을 기준으로 결과를 정렬 할 수 있습니다. 대부분의 데이터베이스에서 여기서 매개 변수를 사용할 수 없습니다 ("ORDER BY?"가 작동하지 않음). 따라서 "ORDER BY"+ 컬럼을 사용해야합니다. 이제 "column"이 String 인 경우 웹 응용 프로그램의 사용자가 코드를 삽입 할 수 있습니다 (쉽지는 않지만 가능한 경우).

관련 문제