복붙노트

[SQL] INSERT에 대한 SQL 주입

SQL

INSERT에 대한 SQL 주입

나는 우리 회사의 인트라넷에 작은 설문 조사 웹 페이지를 만들었습니다. 이 웹 페이지는 외부에서 액세스 할 수 없습니다.

양식은 단순히 라디오 버튼의 몇 가지이며 코멘트 상자.

나는 좋은 코딩 관행을 유지하고 SQL 주입을 방지하려는 싶습니다.

SQL 주입은 텍스트 상자의 의견과 함께 삽입 문에 일어날 수 있습니까? 그렇다면, 어떻게 .NET 2.0을 사용하여 방지 할 수 있습니까?

해결법

  1. ==============================

    1.주입은 제대로 실행되지 SQL 문에 발생할 수 있습니다.

    주입은 제대로 실행되지 SQL 문에 발생할 수 있습니다.

    예를 들어, 귀하의 코멘트 테이블은 두 개의 필드, 정수 ID 및 주석 문자열을 가지고 척하자. 다음과 같이 그래서 당신은 INSERT 것입니다 :

     INSERT INTO COMMENTS VALUES(122,'I like this website');
    

    누군가가 다음 주석을 입력 고려 :

    '); DELETE FROM users; --
    

    당신은 어떤 코멘트 다음에 다음 두 문장에 당신의 단일 INSERT를 돌 수 있었다이를 처리하지 않고 SQL에 주석 문자열을 넣을 경우 :

    INSERT INTO COMMENTS VALUES(123,''); DELETE FROM users; -- ');
    

    이는 사용자 테이블에서 모든 것을 삭제합니다. 그리고 시행 착오와 다양한 트릭을 사용하여 비울 수있는 권리 TABLENAME을 찾는 하루 종일 지출하고자하는 사람들이있다. 여기에 당신이 SQL 주입 공격을 수행 할 수있는 방법에 대한 설명입니다.

    이를 방지하기 위해 매개 변수화 된 SQL 문을 사용합니다.

    그리고 이것은 단지 보안상의 이유로이 아니다. 예를 들어, 당신은 순진하게도 다음과 같은 코멘트를 SQL 문을 만드는 경우 :

    I'm just loving this website
    

    아포스트로피의 닫는 따옴표로 SQL에 의해 해석되고 때문에 SQL 구문 오류가 발생합니다.

  2. ==============================

    2.텍스트가 자동으로 인용 될 수 있도록 사용하여 쿼리를 매개 변수화.

    텍스트가 자동으로 인용 될 수 있도록 사용하여 쿼리를 매개 변수화.

    SqlCommand command = connection.CreateCommand();
    command.CommandText = "insert into dbo.Table (val1,val2,txt) values (@val1,@val2,@txt)";
    command.AddParameterWithValue( "val1", value1 );
    command.AddParameterWithValue( "val2", value2 );
    command.AddParameterWithValue( "txt", text );
    
    ...
    
  3. ==============================

    3.SQL 주입하면 데이터베이스에 쿼리 등을 통과 언제든지 발생할 수 있습니다. 다음은 간단한 데모입니다 :

    SQL 주입하면 데이터베이스에 쿼리 등을 통과 언제든지 발생할 수 있습니다. 다음은 간단한 데모입니다 :

    SQL 인젝션은 설명했다

    핵심은 .NET 내에서, 데이브 웹이이 주신대로하는 것입니다. 그것은 쿼리를 변경하는 SQL 서버에 의해 해석 또는 추가 명령을 추가 할 수있는 모든 문자를 처리, 제출 한 매개 변수로 전체 문자열을 포괄하여 주입 시도를 방지 할 수 있습니다.

    그리고 SQL 주입 응용 프로그램뿐 아니라 웹 애플리케이션에서 발생할 수 있다고 지적한다. 그리고 내부 공격은 일반적으로 조직에 가장 비용이 많이 드는입니다. 하나는 안전하게 공격이 내에서 발생하지 않을 것이라고 가정 할 수 없다.

  4. ==============================

    4.예, 그럴 수 있습니다. 하자가 클라이언트가이 보내는 말 :

    예, 그럴 수 있습니다. 하자가 클라이언트가이 보내는 말 :

    OR 1 = 1
    

    그건 당신이 매우 고통 스러울 수

      SELECT * FROM admin WHERE name = @name AND password = @password
    

    당신은 이것을 방지 할 수 있습니다

  5. ==============================

    5.네,이 발생할 수 있습니다. 이 방지하는 가장 쉬운 방법은 수동으로 SQL을 구축보다는 준비된 문을 사용하는 것입니다.

    네,이 발생할 수 있습니다. 이 방지하는 가장 쉬운 방법은 수동으로 SQL을 구축보다는 준비된 문을 사용하는 것입니다.

    그래서, 오히려 이보다 :

    String sql = 
     String.Format("INSERT INTO mytable (text_column) VALUES ( '{0}' )",
       myTextBox.Text); // Unsafe!
    

    당신이 뭔가를 할 것이다 :

    String sql = "INSERT INTO mytable (text_column) VALUES ( ? )"; // Much safer
    

    그런 다음 자동으로 이스케이프의 원인이 될 수 있고, 대체됩니다 DbCommand에 대한 매개 변수로 텍스트 상자의 텍스트를 추가 "를?" 는 SQL있다.

  6. ==============================

    6.당신의 SQL에 문자열을 준비 제표 및 매개 변수를 사용하여보다는 합치뿐만 아니라 당신은 또한 다음을 수행해야합니다 :

    당신의 SQL에 문자열을 준비 제표 및 매개 변수를 사용하여보다는 합치뿐만 아니라 당신은 또한 다음을 수행해야합니다 :

  7. ==============================

    7.준비된 문을 사용하여 방지 SQL 주입. placehoder (?)의 사용은 완전히 SQL 주입 취약점을 제거합니다. 예 사용자 이름이 '+ request.getparameter ( "이름") +'= user_table에서 문자열 SQL = 선택 *; statement.executeQuery (SQL);

    준비된 문을 사용하여 방지 SQL 주입. placehoder (?)의 사용은 완전히 SQL 주입 취약점을 제거합니다. 예 사용자 이름이 '+ request.getparameter ( "이름") +'= user_table에서 문자열 SQL = 선택 *; statement.executeQuery (SQL);

    위의 문장은 SQL 인젝션에 취약합니다.

    SQL 인젝션에 대한 안전하게 확인하십시오. 스 니펫 다음 사용

    문자열 SQL = user_table에서 선택 * 어디에 사용자 이름 =?; (1 자명) statement.setString;

  8. ==============================

    8.SQL 주입의 양식을 방지하는 가장 쉬운 방법은, 오히려 그 후에 실행하는 SQL 문을 구축하는 매개 변수와 저장 프로 시저를 사용하는 것입니다. (에서 C # 또는 내부적으로 SQL 서버).

    SQL 주입의 양식을 방지하는 가장 쉬운 방법은, 오히려 그 후에 실행하는 SQL 문을 구축하는 매개 변수와 저장 프로 시저를 사용하는 것입니다. (에서 C # 또는 내부적으로 SQL 서버).

    그러나 지금까지 내부적으로 발생하는 가능성이 최상의 최소화로 물론 그것은 당신의 기업 정책 않는 한 나는 완전히 확실히 당신이 시간을 소비해야 아니에요, 그리고이 발생 않은 경우에, 나는 당신이 알고있는 것입니다 희망 즉시 사람 그것은.

  9. from https://stackoverflow.com/questions/681583/sql-injection-on-insert by cc-by-sa and MIT license