>

답변을 알아야하기 때문에이 질문에 약간의 소량을 묻습니다. 다음 코드에서 주입이 발생할 수 있는지와 어떻게 친절 할 수 있습니까?

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

"일반적인"사용자 입력을 처리하기위한 베스트 프랙티스 나 입력 검증이 아니라 주입 시도 및 기타 악의적 인 입력에 대해 궁금합니다. 나는 사람들이 CFQueryParam의 사용을 강력히 옹호하는 것을 보았지만, 요점을 알지 못한다고 생각합니다. 사용자 입력이 데이터베이스 스키마와의 일관성에 대해 유효성이 검증 된 경우 (예 : 숫자 데이터베이스 필드의 경우 입력이 숫자 여야 함) CFQueryParam을 사용하여 얻을 수있는 다른 것이 있습니까? <cfqueryparam CFSQLType = "CF_SQL_VARCHAR"> 는 무엇입니까  그 '#value#' 를  하지 않습니까?


  • 답변 # 1

    와이즈 비즈

    네,

    doesn't CF already "magically" do this in CF query tag when you wrap evaluated variables in single quotes?

    로 변환합니다   ' 로  당신을 위해.

    이 코드에서 어떤 SQL을 얻는 지 추측 해보십시오 :

    ''
    
    


    cfqueryparam 태그가 작동합니다. 쿼리 매개 변수를 사용하면 SQL 삽입이 해결됩니다.

    유효성 검사, 위생 처리 또는 이스케이프 처리에 대한 모든 사용자 정의 서면 시도 (btw)는 기껏해야 코드가 실행되는 데이터베이스 시스템에 대한 개발자의 지식만큼이나 좋습니다.

    개발자가 다른 이스케이프 메소드를 인식하지 못하거나 값이 유효성 검증/이스케이프 사이에서 수정되어 SQL로 렌더링되는 경우 또는 코드베이스가 다른 데이터베이스 시스템으로 포팅되어seems문제가되지 않으면 맞춤 코드가 손상 될 수 있습니다.

    보안에 관해서는 그런 기회를 원하지 않습니다. cfqueryparam을 사용하십시오.

  • 답변 # 2

    업데이트 :

    이것이 당신의 질문의 일부에 대답하는 동안, Peter의 대답은 "CF가 작은 따옴표를 이스케이프하여 자동으로 보호를 추가 할 때 왜 cfqueryparam을 사용 하는가?"라는 질문을 직접 다루기 때문에 더 좋습니다. 답 : 즉, 후자는 항상 작동하지 않기 때문입니다. 바인드 변수는 수행합니다.

    <시간> 와이즈 비즈

    예, 대부분의 버전은 cfqueryparam을 사용하지 않는 사람들을위한 작은 따옴표를 자동으로 이스케이프 처리합니다. 그러나 Scott은 위에서 언급 한 것처럼 cfqueryparam (예 : 바인드 변수)을 사용하여 매개 변수가 SQL 명령으로실행되지 않도록하기 때문에 cfqueryparam을 사용하는 것이 좋습니다. Peter의 답변에서 알 수 있듯이 자동 이스케이프 기능이 작동하지 않는 경우에도 바인드 변수가 작동합니다.

    SQL 인젝션 보호는 실제로 바인드 변수 사용의 부작용 일뿐입니다. 바인드 변수를 사용하는 주요 이유는 성능입니다. 바인드 변수는 # parameters #가 변경 될 때마다 새 계획을 작성하는 대신 데이터베이스가 쿼리 계획을 재사용하도록 권장합니다. 컴파일 시간이 단축되어 성능이 향상됩니다.

    Cfqueryparam에는 다음과 같은 여러 가지 이점이 있습니다.

    데이터 유형 검사 (길이, 값, 유형 등)를 제공합니다

    "리스트"및 <cfset value = "\'; DROP TABLE tableName -- " /> <cfquery> select * from tableName where fieldName = '#value#' </cfquery> 의 처리를 단순화하는 속성을 제공합니다  값

    데이터베이스 검사를전에수행하여 모든 SQL이 데이터베이스로 전송되어 데이터베이스 호출 낭비를 방지합니다

    문자열에 실제로 적용되지는 않지만 IMO를 사용해야하는 또 다른 큰 이유는 정확성입니다. 인용 된 문자열을 데이터베이스에 전달할 때 암시 적 변환에 의존합니다. 본질적으로 비교를 가장 잘 수행하는 방법을 파악하기 위해 데이터베이스에 남겨두고 결과가 항상 기대했던 것은 아닙니다. (날짜 문자열이 대표적인 예입니다). 데이터베이스가 SQL을 실행하기로 결정한 방법에 따라 부정확 한 결과 또는 때로는 느린 쿼리로 끝날 수 있습니다. cfqueryparam을 사용하면 모호성을 제거하여 이러한 문제를 피할 수 있습니다.

  • 답변 # 3

    질문의 첫 번째 부분에 답하려면

    It says in the docs "escapes string variables in single-quotation marks" but doesn't CF already "magically" do this in CF query tag when you wrap evaluated variables in single quotes?

    를 설정하십시오  변수를 다음과 같이 변경하십시오.

    null
    
    

    이 쿼리가 실행됩니다 :

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

  • 이전 ios - 버튼을 클릭 할 때 PDF 문서 열기
  • 다음 javascript - Google 맵 외부의 외부 링크에서 infoWindows 열기