SQLParameter는 SQL 주입을 어떻게 방지합니까?
SQLParameter 가 .NET Parameterized 쿼리에서 SQL Inection 공격을 방지 하도록 배경에서 정확히 무슨 일이 일어나고 있습니까? 의심스러운 캐릭터를 제거하는 것입니까, 아니면 더 많은 것이 있습니까?
악의적 인 입력을 통과 할 때 실제로 SQL Server에 어떤 영향이 있는지 확인한 사람이 있습니까?
관련 : SQL FROM 문에서 SQLParameter를 사용할 수 있습니까?
기본적으로 SQLCommand
using 을 수행 할 때 SQLParameters
매개 변수는 명령문에 직접 삽입되지 않습니다. 대신 호출 된 시스템 저장 프로 시저 sp_executesql
가 호출되고 SQL 문자열과 매개 변수 배열이 제공됩니다.
이렇게 사용하면 매개 변수가 분리되어 데이터로 취급되므로 명령문에서 구문 분석을 수행하지 않아도되므로 매개 변수에 포함 된 내용을 "실행"할 수 없습니다. 매개 변수 값이 어떤 식 으로든 유효하지 않다는 큰 오류가 발생합니다.
이해하기 쉽고 더 일반적인 대답은 다음과 같습니다.
동적 SQL 쿼리를 상상해보십시오.
sqlQuery='SELECT * FROM custTable WHERE User=' + Username + ' AND Pass=' + password
간단한 SQL 주입은 사용자 이름을 다음과 같이 입력하는 것입니다. ' OR 1=1--
이것은 효과적으로 SQL 쿼리를 만듭니다.
sqlQuery='SELECT * FROM custTable WHERE User='' OR 1=1-- ' AND PASS=' + password
사용자 이름이 비어 ''
있거나 ( ) 1=1
부울 (true와 동일 함 ) 인 모든 고객을 선택 합니다. 그런 다음 --
나머지 쿼리를 주석 처리하는 데 사용 합니다. 따라서 전체 고객 테이블 을 인쇄 하거나 원하는 모든 작업을 수행 할 수 있습니다.
이제 매개 변수화 된 쿼리는 다음과 같은 코드를 사용하여 다르게 수행합니다.
sqlQuery='SELECT * FROM custTable WHERE User=? AND Pass=?' parameters.add("User", username) parameters.add("Pass", password)
여기서 사용자 이름 및 암호는 입력 된 관련 사용자 이름 및 암호를 가리키는 변수입니다.
이제이 시점에서 여러분은 이것이 전혀 변경되지 않는다고 생각할 수 있습니다. 확실히 Nobody OR 1 = 1 '-과 같은 사용자 이름 필드에 입력하여 효과적으로 쿼리를 작성할 수 있습니다.
sqlQuery='SELECT * FROM custTable WHERE User=Nobody OR 1=1'-- AND Pass=?'
그리고 이것은 유효한 주장처럼 보일 것입니다. 그러나 당신은 틀릴 것입니다.
매개 변수가있는 쿼리가 작동하는 방식은 SQL 쿼리가 쿼리로 전송되고 데이터베이스가이 쿼리가 수행 할 작업을 정확히 알고있는 경우에만 사용자 이름과 암호를 값으로 삽입한다는 것입니다. 이는 데이터베이스가 쿼리가 수행 할 작업을 이미 알고 있기 때문에 쿼리에 영향을 줄 수 없음을 의미합니다. 따라서이 경우에는의 사용자 이름 Nobody OR 1=1'--
과 빈 암호를 찾게 되는데 이는 false가되어야합니다.
그러나 이것은 완전한 솔루션이 아니며 여전히 javascript를 데이터베이스에 넣을 수 있으므로 xss 공격 과 같은 다른 문제에 영향을 미치지 않기 때문에 입력 유효성 검사를 수행해야 합니다. 그런 다음 이것이 페이지에 읽 히면 출력 유효성 검사에 따라 일반 자바 스크립트로 표시됩니다. 따라서 가장 좋은 방법은 여전히 입력 유효성 검사를 사용하지만 매개 변수가있는 쿼리 또는 저장 프로 시저를 사용하여 SQL 공격을 중지하는 것입니다.
출처 : http://www.lavamunky.com/2011/11/why-parameterized-queries-stop-sql.html
"SqlParameterCollection과 같은 매개 변수 컬렉션은 형식 검사 및 길이 유효성 검사를 제공합니다. 매개 변수 컬렉션을 사용하는 경우 입력은 리터럴 값으로 처리되고 SQL Server는이를 실행 코드로 처리하지 않습니다. 매개 변수 컬렉션을 사용하는 또 다른 이점은 다음과 같습니다. 유형 및 길이 검사를 시행 할 수 있습니다. 범위를 벗어난 값은 예외를 트리거합니다. 이것은 심층 방어의 좋은 예입니다. "
http://msdn.microsoft.com/en-us/library/ff648339.aspx
매개 변수화 된 쿼리를 사용하면 공격 표면이 매개 변수를 사용하는 것으로 줄어 듭니다.
를 사용 SqlParameters
하되 오버플로, 언더 플로 및 검증되지 않은 매개 변수를 잊지 마십시오 . 예를 들어, 메서드가 "proc buy_book (@price money
)"이면 악의적 인 공격자는 응용 프로그램이로 @price
설정된 상태로 실행되도록 속 0.01
이거나 오버플로를 유발하는 무언가를 제출하여 응용 프로그램이 흥미로운 작업을 수행하도록 시도합니다. SQL 오버플로는 흥미롭지 않은 경향이 있습니다 (예 : 예외를 유발할 뿐이며 인접 메모리에 쓸 수 없을 가능성이 높습니다).
참고 URL : https://stackoverflow.com/questions/4892166/how-does-sqlparameter-prevent-sql-injection
'IT Share you' 카테고리의 다른 글
오류 : 현재 컨텍스트에 'ConfigurationManager'이름이 없습니다. (0) | 2020.11.07 |
---|---|
투명한 그라디언트를 만드는 방법? (0) | 2020.11.07 |
카피 바라 : 페이지 제목을 테스트하는 방법은 무엇입니까? (0) | 2020.11.07 |
Mac OS X의 Git 및 Umlaut 문제 (0) | 2020.11.07 |
git은 현재 브랜치를 어떻게 가져올 수 있습니까? (0) | 2020.11.07 |