복붙노트

[SQL] 어떻게 SQL 주입에 대한 매개 변수화 된 쿼리 도움을?

SQL

어떻게 SQL 주입에 대한 매개 변수화 된 쿼리 도움을?

모두가 1, 2 조회에서 텍스트 상자의 텍스트는 데이터베이스에 삽입됩니다. 여기에 매개 변수가있는 쿼리의 의미는 무엇입니까?

또한, 여기에 내가 잘못된 문자의 삽입을 중지 정규 표현식 유효성 검사를 사용합니다.

해결법

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

    1.매개 변수가있는 쿼리는 SQL 쿼리를 실행하기 전에 인수의 적절한 치환을. 그것은 완전히 쿼리의 의미를 변화 "더러운"입력의 가능성을 제거합니다. 입력이 SQL이 포함 된 경우 즉, 그것은 SQL이 결과 문에 주입되지 않습니다 becase 실행 무엇의 일부가 될 수있다.

    매개 변수가있는 쿼리는 SQL 쿼리를 실행하기 전에 인수의 적절한 치환을. 그것은 완전히 쿼리의 의미를 변화 "더러운"입력의 가능성을 제거합니다. 입력이 SQL이 포함 된 경우 즉, 그것은 SQL이 결과 문에 주입되지 않습니다 becase 실행 무엇의 일부가 될 수있다.

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

    2.가능한 파라미터를 그 ​​안에 가지고 SQL로해야 문자열이 처리되지 않는 경우가 발생 SQL 인젝션

    가능한 파라미터를 그 ​​안에 가지고 SQL로해야 문자열이 처리되지 않는 경우가 발생 SQL 인젝션

    예를 들면 :

    var sqlquerywithoutcommand = "select * from mytable where rowname =  '" + condition+''";
    

    그리고 조건은 요청의 사용자로부터 오는 문자열입니다. 조건은 악성 인 경우 예를 들면 말 :

    var sqlquerywithoutcommand = "select * from mytable where rowname =  '" + "a' ;drop table  mytable where '1=1"+"'";
    

    당신은 악성 스크립트를 실행 끝낼 수 있었다.

    하지만 매개 변수를 입력을 사용하는 문자열 문자를 이스케이프 수있는 문자로 정리됩니다 ...

    당신은 스크립트 주입 실행할 수 없습니다 온다 상관없이 보장 할 수 없습니다.

    매개 변수를 사용하여 실제로 같을 것이다 실행 된 SQL을 명령 개체를 사용하여

    select * from mytable where rowname = 'a'';drop table mytable where 1=1'''
    

    본질에 그것은 rowname와 행하기위한 = 찾는 것 '; 드롭 mytable 테이블 어디 1 = 1' 나머지 스크립트를 실행하지

  3. ==============================

    3.에서 촬영

    에서 촬영

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

    4.매개 변수가있는 쿼리 핸들의 모든 - 왜 문제로 이동?

    매개 변수가있는 쿼리 핸들의 모든 - 왜 문제로 이동?

    로 .toString ()가 호출되지 않은 경우 매개 변수화 쿼리로, 일반적으로 주사뿐만 아니라, 당신은 모든 데이터 처리 유형, 숫자 (INT와 플로트), (임베디드 따옴표) 문자열, 아무런 문제 또는 현지화 문제를 포맷 날짜와 시간을 (얻을 고정 문화권하고있는 컴퓨터에 클라이언트 이동 예상치 못한 날짜 형식)과 함께.

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

    5.매개 변수화 된 쿼리는 클라이언트가 개별적으로 데이터를 전달하는 쿼리 텍스트를 형성 할 수 있습니다. 유효성 검사를 할 것입니다 경우에 대부분의 무료 문자에서 + 탈출. 물론 매개 변수화 사출의 다른 종류에 대한 지원을하지 않지만, 매개 변수를 개별적으로 전달되는, 그들은 실행 텍스트 쿼리로 사용되지 않습니다.

    매개 변수화 된 쿼리는 클라이언트가 개별적으로 데이터를 전달하는 쿼리 텍스트를 형성 할 수 있습니다. 유효성 검사를 할 것입니다 경우에 대부분의 무료 문자에서 + 탈출. 물론 매개 변수화 사출의 다른 종류에 대한 지원을하지 않지만, 매개 변수를 개별적으로 전달되는, 그들은 실행 텍스트 쿼리로 사용되지 않습니다.

    좋은 비유는 "최근"실행이 버퍼 오버 플로우로부터 보호하기 위해 현대 프로세서의 대부분과 운영 시스템에 사용되는 비트가 될 것이다. 여전히 버퍼 오버 플로우를 허용하지만, 주입 데이터의 실행을 방지 할 수있다.

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

    6.일이 그렇게 느끼는 이유는 확실히 이해할 수있다.

    일이 그렇게 느끼는 이유는 확실히 이해할 수있다.

    sqlQuery = "select * from users where username='+username+';"
    

    sqlQuery = "select * from users where username=@username;"
    

    모두 위의 쿼리는 실제로하지 안하 동일한 기능을 수행 할 것으로 보인다.

    질의에 대한 이전의 용도는 입력, 후자는 쿼리를 결정하지만 쿼리의 실행 동안 그대로 만 입력을 대체.

    더 명확하게하기 위해, 매개 변수 메모리 저장되고 필요시 검색에 사용되는 '값은 변수 어디 어디 스택에 어떤 위치를 제공합니다.

    그래서 우리는 포기했다 'OR'경우 1 '='1 이름의 입력으로, 동적으로 다음 실행되는 SQL 쿼리 문자열은 SQLQuery의 일환으로 새로운 쿼리 나 쿼리를 구성 할 전.

    동일한 입력에있는 동안, 쿼리 문자열은 SQLQuery에서 정적으로 지정된 쿼리 사용자 테이블의 사용자 이름 필드에 1 '=', 후자를 검색 'OR'것

    그냥 통합, 이것은 당신이 메이크업 쿼리에 매개 변수를 사용하는 방법입니다 :

    SqlCommand command = new SqlCommand(sqlQuery,yourSqlConnection);
    
    SqlParameter parameter = new SqlParameter();
    parameter.ParameterName = "@username";
    parameter.Value = "xyz";
    
    command.Parameters.Add(parameter);
    
  7. from https://stackoverflow.com/questions/5468425/how-do-parameterized-queries-help-against-sql-injection by cc-by-sa and MIT license