5

SQL 주입에 대해 잘 알고 있습니다. 사용자가 앱, 웹 사이트, 클라이언트에 악의적 인 값을 삽입 할 때 예상되는 SQL 쿼리, 무엇을왜 매개 변수가있는 쿼리 또는 엔티티 프레임 워크를 사용하면 SQL 삽입을 방지합니까?

SELECT FirstName, LastName 
FROM Customers 
WHERE CustomerId = '' ; DROP DATABASE Foo -- 

같은 쿼리로 바뀌 가져옵니다

SELECT FirstName, LastName 
FROM Customers 
WHERE CustomerId = @valueFromApplication 

같은 것을 할 때입니다 .. 또한 DB를 삭제하는 대신 공격자가 테이블 이름을 찾고 정보를 얻으려고 시도 할 수 있음을 알고 있습니다.

나는 또한 방지하는 데 도움이 몇 가지를 알고이 있습니다 : 매개 변수 (SQL 서버) 매개 변수화 SQL을 사용하여

  • 이 엔티티에 엔티티 프레임 워크/LINQ를 사용
  • 를 쿼리을 저장 프로 시저를 사용

    1. (C#을 , 아마도 F #?)

    이러한 것들이 실제로 SQL 주입을 어떻게 방지합니까? 공격자가 이미 사용하고있는 입력에 동일한 악의적 인 가치를 전달할 수없는 이유는 무엇입니까?

  • +2

    매개 변수로 보낼 내용이 있으면 SQL Server는이를 매개 변수로 처리하므로 \ SQL 코드로 처리하지 않습니다. 따라서 매개 변수의 내용은 실행되지 않습니다 –

    +2

    첫 번째 SQL 문은 매개 변수화되었으며 SQL 삽입에 취약하지 않습니다. C# 코드'string sql = "고객의 성, 성을 선택하십시오 CustomerId ="+ valueFromApplication; "은 취약합니다. – Blorgbeard

    +0

    매개 변수에 '-'또는 ';'와 같은 일부 코드 분리 구문을 전달하면 일반 문자로 처리하고이를 단순히 열 필드에 삽입하거나 업데이트하거나 다른 작업을 수행합니다. 예를 들어 LIKE 연산자는 대신 문자열 자체로 매개 변수 값 "; 데이터베이스 삭제"를 검색합니다. – sir4ju1

    답변

    9

    첫 번째 예는 매개 변수화되었으며 SQL 주입에 취약하지 않습니다.

    매개 변수화 된 검색어는 단순히 @varvalue (으)로 바꾸는 것처럼 값이있는 서버로 대체되지 않습니다. 그들은 당신이 보낸 그대로 정확히 보내고받습니다 .. @valueFromApplication.

    서버가 쿼리를 구문 분석하고 변수에 도달하면 제공된 값을 조회합니다. 그 값이 '' ; DROP DATABASE Foo --이면 .. 이됩니다. 그것은 구문 분석하지 않습니다. 그냥 텍스트/숫자/모든 형식으로 사용합니다.

    Entity Framework에 대해 추가하기 위해 내부적으로 Parameterised 쿼리를 사용하므로 SQL 주입 안전성을 제공합니다.

    8

    매개 변수는 단순히 SQL에서 인라인으로 대체되지 않고 SQL Server에 대한 쿼리와 별도로 전송됩니다.

    그래서, SQL 서버 같은 것을 가져옵니다

    Query: 
        SELECT FirstName, LastName FROM Customers WHERE CustomerId = ? 
    Parameter 1: 
        '' ; DROP DATABASE Foo -- 
    

    를 그러므로 누구의 고객 ID는 '' ; DROP DATABASE Foo --에 그대로 동일 고객에 대한 확인 쿼리를 컴파일합니다. 매개 변수 값은 절대로 SQL로 실행되지 않습니다.