문제

MySQL 데이터베이스에서 (중요한 경우)라고 가정 해 봅시다.

도움이 되었습니까?

해결책

아니요, 당신은 완전히 안전하지 않을 것입니다. 다른 사람들이 언급했듯이, 매개 변수화 된 쿼리는 데이터베이스에 어떻게 액세스하는지 상관없이 항상 갈 길입니다.

Procs와 함께 당신은 안전한 도시 전설입니다. 사람들 이이 망상하에있는 이유는 대부분의 사람들이 코드에서 매개 변수화 된 쿼리로 Procs를 호출한다고 가정하기 때문입니다. 그러나 그렇지 않으면 예를 들어 아래와 같은 일을한다면 넓게 열립니다.

SqlCommand cmd = new SqlCommand("exec @myProc " + paramValue, con);
cmd.ExecuteNonQuery();

최종 사용자의 필터링되지 않은 콘텐츠를 사용하고 있기 때문입니다. 다시 한 번, 그들이해야 할 일은 선을 끝내고, 위험한 명령을 추가하고, 붐을 추가하는 것입니다.

(웹에있는 경우, 브라우저의 쿼리 문자열에서 필터링되지 않은 쓰레기를 가져 가지 마십시오. 이는 데이터에 매우 나쁜 일을하는 것이 부끄럽게 쉽게 만듭니다.)

쿼리를 매개 변수화하면 모양이 훨씬 좋습니다. 그러나 다른 사람들이 언급했듯이, Proc가 여전히 동적 SQL을 생성하고이를 실행하고 있다면 여전히 문제가있을 수 있습니다.

나는 반영자가 아니라는 점에 주목해야한다. Procs는 데이터 액세스의 특정 문제를 해결하는 데 매우 도움이 될 수 있습니다. 그러나 Procs는 있습니다 ~ 아니다 "SQL 주입에 대한 은색 용액.

다른 팁

매개 변수화 된 쿼리를 일관되게 사용하는 경우 SQL 주사에만 면역됩니다. 당신은 거의 SQL 주사에 대한 면역이면 어디서나 적절한 탈출을 사용하는 경우 (그러나 탈출 루틴에 버그가있을 수 있고 있었으므로 매개 변수만큼 어리석지 않습니다).

저장 프로 시저를 호출하여 연결을 통해 인수를 추가하는 경우 입력 필드 중 하나의 끝에 임의의 쿼리를 추가 할 수 있습니다. 예를 들어 checklogin @username = '$ username', @password = '가있는 경우. 직접 연결된 변수를 나타내는 $ -things가있는 $ password '는 "'; drop database;-"를 읽기 위해 $ password 변수를 변경하는 것을 막을 수 없습니다.

분명히 입력을 미리 정리하면 SQL 주입 방지에도 기여하지만 이는 청소되지 말아야 할 데이터를 걸러 낼 수 있습니다.

저장된 Procs가하는 일에 따라 다릅니다. 매개 변수를 기반으로 SQL을 동적으로 생성 한 다음 해당 SQL을 실행하면 여전히 취약합니다. 그렇지 않으면, 당신은 훨씬 더 괜찮을 가능성이 높습니다. 그러나 나는 100% 자신감을 보이기 위해 망설입니다!

아니요. 저장 프로 시저를 호출하는 SQL을 구성하는 경우에도 여전히 대상입니다.

클라이언트 측에서 매개 변수화 된 쿼리를 만들어야합니다.

아니요, 저장된 절차에서 여전히 D-SQL을 사용할 수 있으므로 ... 어떤 경우에도 입력을 검증하고 제한하는 것이 좋습니다.

저장된 절차는 실제로 취약한 것이 동적 코드이며 저장된 절차 내부의 코드와 저장 프로 시저에 동적으로 생성 된 통화를 포함하기 때문에 보장되지 않습니다.

매개 변수화 된 쿼리 및 매개 변수로 호출 된 저장된 Procs는 코드를 생성하기 위해 임의의 입력을 사용하지 않는 한 주입에 무적입니다. 주입에 취약하지 않은 동적 코드가 많이 있습니다 (예 : 동적 코드의 정수 매개 변수).

그러나 Procs 기반 아키텍처가 저장된 저장된 이점은 다음과 같이 저장된 Procs 기반 아키텍처의 이점은 다음과 같은 이유로 클라이언트 측의 동적 코드에 대해 주입이 다소 방어 될 수 있다는 것입니다.

앱이 연결하는 모든 사용자 컨텍스트에 실행 권한 만 부여되므로 선택, 삽입, 업데이트, 삭제 쿼리는 단순히 실패합니다. 물론, 드롭 등은 어쨌든 허용되지 않아야합니다. 따라서 모든 주입은 Exec의 형태이어야하므로 궁극적으로 SP 계층에서 정의한 작업 만 주사 할 수 있습니다 (임의의 SQL이 아님).

데이터베이스 서비스를 일련의 저장 프로 시저로 정의하면 소프트웨어의 추상화 계층과 같은 많은 다른 이점 중에는 앱에 영향을 미치지 않고 데이터베이스를 리팩터링하는 기능이므로 데이터베이스의 사용 패턴을 더 잘 이해하고 모니터링 할 수 있습니다. 프로파일 러 및 새로운 클라이언트를 배포하지 않고도 데이터베이스 내에서 선택적으로 최적화 할 수있는 기능.

또한, 데이터베이스의 주요 사용자는 데이터베이스의 주요 사용자가 작업을 수행하는 데 필요한 권한이 정확히 있어야하며 다른 조치를 취해야합니다. 설치 후 새 테이블을 만들 필요가 없습니까? 그 허가를 철회하십시오. sysdba로 합법적 인 필요가 없습니까? 그럼! 사용자에게 해당 권한을 부여하지 않은 경우 사용자에게 "데이터베이스를 삭제"하도록 지시하는 비열한 주입은 스티임이됩니다. 그런 다음 걱정할 필요가있는 것은 데이터 누출 선택 설명 만하면됩니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top