source

SQL Parameter는 어떻게 SQL 주입을 방지합니까?

manycodes 2023. 4. 21. 21:04
반응형

SQL Parameter는 어떻게 SQL 주입을 방지합니까?

백그라운드에서 정확히 무슨 일이 일어나고 있는지SQLParameter가 SQL Inection 공격을 방지합니다.NET 매개 변수화된 쿼리?용의자를 제거하는 건가요? 아니면 뭔가 더 있는 건가요?

악의적인 입력을 전달했을 때 SQL Server에 실제로 도달하는 결과를 확인한 사람이 있습니까?

관련:SQL FROM 문에 SQL Parameter를 사용할 수 있습니까?

기본적으로는 다음 작업을 수행할 때SQLCommand사용.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=1true에 해당하는 부울입니다.그 후,--나머지 쿼리에 코멘트를 붙입니다.따라서 전체 고객 테이블을 인쇄하거나 원하는 작업을 수행할 수 있습니다.

이제 매개 변수화된 쿼리는 다음과 같은 코드를 사용하여 다르게 처리합니다.

sqlQuery='SELECT * FROM custTable WHERE User=? AND Pass=?' parameters.add("User", username) parameters.add("Pass", password)

여기서 username과 password는 관련된 입력된 사용자 이름과 비밀번호를 나타내는 변수입니다.

이 시점에서는 아무것도 변하지 않는다고 생각하실 수 있습니다.사용자 이름 필드에 Nobody OR 1=1'과 같이 입력하면 효과적으로 다음과 같은 쿼리를 만들 수 있습니다.

sqlQuery='SELECT * FROM custTable WHERE User=Nobody OR 1=1'-- AND Pass=?'

그리고 이것은 타당한 주장처럼 보일 것이다.하지만 당신이 틀릴 거예요.

파라미터화된 쿼리가 작동하는 방식은 SQL 쿼리가 쿼리로 전송되며 데이터베이스는 이 쿼리의 동작을 정확하게 인식하고 있어야 사용자 이름과 패스워드가 값으로서만 삽입됩니다.즉, 데이터베이스는 쿼리의 동작을 이미 알고 있기 때문에 쿼리에 영향을 줄 수 없습니다.따라서 이 경우, 이 사용자 이름으로 검색됩니다.Nobody OR 1=1'--을 사용하다

그러나 이것은 완전한 해결책은 아니며, 입력 검증은 여전히 이루어져야 합니다. 왜냐하면 이것은 여전히 에 javascript를 넣을 수 있기 때문에 xss 공격과 같은 다른 문제에 영향을 주지 않기 때문입니다.그리고, 이것을 페이지에 읽어내면, 출력 검증에 따라서는 통상의 javascript로서 표시됩니다.따라서 입력 검증을 사용하되 매개 변수화된 쿼리 또는 저장 프로시저를 사용하여 SQL 공격을 막는 것이 가장 좋습니다.

출처 : http://www.lavamunky.com/2011/11/why-parameterized-queries-stop-sql.html

"Sql Parameter Collection 등의 파라미터 컬렉션은 유형 확인 및 길이 검증을 제공합니다.매개 변수 컬렉션을 사용하는 경우 입력은 리터럴 값으로 처리되며 SQL Server는 이를 실행 가능한 코드로 처리하지 않습니다.파라미터 컬렉션을 사용하면 유형 및 길이 검사를 수행할 수 있다는 추가적인 이점이 있습니다.범위를 벗어나는 값은 예외를 트리거합니다.깊이 있는 방어의 좋은 예라고 말했다.

http://msdn.microsoft.com/en-us/library/ff648339.aspx

매개 변수화된 쿼리를 사용할 경우 공격 표면은 매개 변수를 사용하여 몽키잉하는 것으로 줄어듭니다.

사용하세요SqlParameters 오버플로 및 검증되지 않은 를 들어,가 " "인 경우 "proc " 입니다.buy_book (@price money ) ), ( ), ( ( ), ( ), 「 」, 「 」, 「 」, 「 」, 「 」, 「 」, 「 」, 「 」, 「 」, 「 」, 「 」, 「 」, 「 」, 「 「 「 「 」@price0.01또는 오버플로의 원인이 되는 것을 송신하는 것으로, 애플리케이션이 흥미로운 것을 실행하려고 합니다.SQL 오버플로우는 관심이 없는 경향이 있습니다(예외를 일으킬 뿐 인접 메모리에 쓸 수 없을 것 같습니다).

언급URL : https://stackoverflow.com/questions/4892166/how-does-sqlparameter-prevent-sql-injection

반응형