복붙노트

[SQL] ColdFusion에서 질의 - 사출 보호

SQL

ColdFusion에서 질의 - 사출 보호

내가 답을 알고 있어야 때문에 sheepishness의 비트와 함께이 질문을 부탁드립니다. 누군가가 친절 및 사출 다음 코드에서 발생할 수 있다면 어떻게 설명 할 수 있을까?

<cfquery>
    select * from tableName
    where fieldName = '#value#'
</cfquery>

난 안 모범 사례 또는 "정상적인"사용자 입력을 처리하기위한 입력 검증에 대해, 주입 시도 및 기타 악성 입력에 대해 특히 흥미 롭다. 나는 사람들이 강력하게 CFQUERYPARAM의 사용을 옹호 볼 수 있지만, 나는이 점을 볼 생각하지 않습니다. 사용자 입력이 데이터베이스 스키마에 대한 일관성을 위해 검증 된 경우 (예를 들어, 그래서 입력이 숫자 데이터베이스 필드의 숫자이어야), CFQUERYPARAM를 사용하여 얻은 다른 사람이 무엇입니까? 무엇을 그 '# 값 #'은하지 않습니다합니까?

해결법

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

    1.그래, 당신을 위해 ''에 '변환 할 수 있습니다.

    그래, 당신을 위해 ''에 '변환 할 수 있습니다.

    이제 SQL은이 코드에서 무엇을 얻을 것 같아요 :

    <cfset value = "\'; DROP TABLE tableName -- " />
    
    <cfquery>
        select * from tableName
        where fieldName = '#value#'
    </cfquery>
    

    CFQUERYPARAM 태그 작품; 쿼리를 사용하여 해결할 수있는 문제를 SQL 주입을 PARAMS.

    , 검증 살균, 또는 탈출에 사용자 정의 작성 시도 (BTW 모두 별도 일들이) 최상의 만 코드에 대해 실행중인 데이터베이스 시스템의 개발자의 지식 좋은대로입니다.

    개발자가 다른 탈출 방법을 알지 못하는 경우 값이 검증 / 탈출하고는 SQL로 렌더링되는 사이에 수정하는 경우, 또는 코드베이스가 다른 데이터베이스 시스템에 이식 및 벌금을 것 같다 또는 경우에도 사용자 지정 코드의 기회가있다 분해.

    이 보안에 올 때, 당신은 그런 기회를 원하지 않는다. 사용 CFQUERYPARAM 그래서.

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

    2.최신 정보:

    최신 정보:

    이 질문의 일부를 대답하면서 직접 "왜 사용 CFQUERYPARAM, CF가 자동으로 작은 따옴표를 이스케이프에 의해 보호를 추가?"의 질문을 해결한다는 점에서, 베드로의 반응은 좋습니다. 답변 : 즉, 후자는 항상하지 않기 때문에 작동합니다. 바인드 변수는 않습니다.

    네, 대부분의 버전은 자동으로 CFQUERYPARAM를 사용하는하지에 대한 보호 조치로 작은 따옴표를 탈출. 스콧은 위에서 언급 한대로이 매개 변수는 SQL 명령으로 실행되지 않도록하기 때문에, 그것은 사용 CFQUERYPARAM (즉 바인드 변수)하는 것이 좋습니다. 베드로의 대답은 보여줍니다으로 바인드 변수, 심지어 자동 이스케이프하지 않는 경우에 작동합니다.

    즉, SQL 인젝션 보호 정말로 바인드 변수를 사용하여 단지 부작용했다. 바인드 변수를 사용하는 주된 이유는 성능이다. 바인드 변수 대신 새로운 계획 때마다 # 매개 변수 # 변화를 만드는, 재사용 쿼리 계획에 대한 데이터베이스를 권장합니다. 컴파일 시간에 내려 그 상처, 성능을 향상.

    CFQUERYPARAM는 다른 장점이 있습니다 :

    정말 문자열 컬럼에 적용되지 않지만, IMO 또 다른 큰 이유는 정확성이다 사용할 수 있습니다. 데이터베이스에 인용 된 문자열을 전달하면 암시 적 변환에 의존하고 있습니다. 기본적으로 당신은 최선을 비교를 수행하는 방법을 알아 내기 위해 데이터베이스에 그것을 떠나, 그 결과는 항상 기대하고 있었는지되지 않습니다. (날짜 문자열은 대표적인 예이다). 당신은 데이터베이스가 SQL을 실행하기로 결정 방법에 따라 부정확 한 결과, 때로는 느린 쿼리를 종료 할 수 있습니다. CFQUERYPARAM를 사용하여 모호성을 제거함으로써 이러한 문제를 방지 할 수 있습니다.

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

    3.다음에 # 값 # 변수를 설정, 질문의 첫 부분에 대답하려면 :

    다음에 # 값 # 변수를 설정, 질문의 첫 부분에 대답하려면 :

    someValue'; DELETE FROM tableName WHERE '1' = '1
    

    이 쿼리가 실행되는 결과 것입니다 :

    <cfquery>
        select * from tableName
        where fieldName = 'someValue'; DELETE FROM tableName WHERE '1' = '1'
    </cfquery>
    
  4. from https://stackoverflow.com/questions/18792320/coldfusion-query-injection-protection by cc-by-sa and MIT license