SQL 삽입 공격으로부터 Dreamweaver의 ColdFusion 서버 동작을 보호합니다.
SQL 삽입 공격의 보안 위험
일부 데이터베이스는 단일 쿼리에서 여러 개의 SQL 문장을 전송할 수 있습니다. 이로 인해 쿼리 문자열에서 동적으로 생성된 데이터베이스 쿼리로 매개 변수를 전달할 때 잠재적인 보안 위험이 있습니다. 해커는 기존의 매개 변수에 악의적인 SQL 문장을 추가하여 URL을 수정하거나 동적 쿼리에서 변수를 만들려고 합니다. 이것을 SQL 삽입 공격이라고 합니다. SQL 삽입 공격 위험을 줄이려면 Dreamweaver에서 생성한 서버 동작 코드의 일부를 수정해야 합니다. SQL 삽입에 대한 자세한 배경 정보는 이 위키디피아 문서를 참조하십시오.
참고: 이 문서에서 설명된 문서는 Dreamweaver 8.0.2 Updater에서 수정되었습니다.
해결 방법: 서버 동작 업데이트
쿼리 문자열을 매개 변수에 전달할 때 예측된 정보만 전달되어야 합니다. Adobe는 SQL 삽입 공격 위험을 줄이기 위해 Dreamweaver 8.0.2 Updater를 만들었습니다. 이러한 수정 사항은 이후의 모든 Dreamweaver 출시에 통합되었습니다. Dreamweaver 8을 업데이트한 후에 서버 동작을 사용하는 페이지에 서버 동작을 다시 적용한 뒤에 해당 페이지를 서버에 다시 배포해야 합니다.
이 문서의 나머지 부분에서는 Dreamweaver MX 2004 코드를 수동으로 편집하여 ColdFusion 서버 모델에서 SQL 삽입 공격을 방지하는 방법에 대해 설명합니다. 이러한 공격에 취약한 서버 동작은 다음과 같으며, 수정 사항과 함께 제시됩니다.
필터가 있는 레코드세트
필터링되지 않은 레코드 집합은 수정할 필요가 없지만 필터링된 레코드 집합은 수정해야 합니다. 아래 예시에서 "Recordset1"이라는 Dreamweaver MX 2004 레코드 집합은 URL 매개 변수에서 전달된 ID 값으로 필터링됩니다. 강조 표시된 아래 코드는 변경해야 합니다.
<cfquery name="Recordset1" datasource="cafetownsend"> SELECT * FROM COMMENTS WHERE COMMENT_ID =#URL.COMMENT_ID#</cfquery>
SQL 삽입 공격으로부터 레코드 집합을 보호하려면 SQL SELECT 문장이 포함된 cfquery 태그 내에서 cfqueryparam 태그를 사용합니다. cfqueryparam 태그는 쿼리 매개 변수의 데이터 유형을 확인하고 인증되지 않은 사용자로부터 데이터베이스의 보안을 유지하도록 지원합니다. 노란색 줄은 수정된 보안 코드입니다.
<cfquery name="Recordset1" datasource="cafetownsend"> SELECT * FROM COMMENTS WHERE COMMENT_ID =<cfqueryparam value="#URL.COMMENT_ID#" cfsqltype="cf_sql_numeric"></cfquery>
레코드 서버 동작 및 Record Insertion Form Wizard 삽입
SQL 삽입 공격으로부터 레코드 집합을 보호하려면 SQL INSERT 문장이 포함된 cfquery 태그 내에서 cfqueryparam 태그를 사용합니다. cfqueryparam 태그는 쿼리 매개 변수의 데이터 유형을 확인하고 인증되지 않은 사용자로부터 데이터베이스의 보안을 유지하도록 지원합니다.
원본 코드입니다. 강조 표시된 아래 코드는 변경해야 합니다.
<cfquery datasource="cafetownsend"> INSERT INTO COMMENTS (FIRST_NAME, LAST_NAME, TELEPHONE) VALUES (<cfif IsDefined("FORM.textfield1") AND #FORM.textfield1# NEQ "">'#FORM.textfield1#'<cfelse>NULL</cfif> ,<cfif IsDefined("FORM.textfield2") AND #FORM.textfield2# NEQ "">'#FORM.textfield2#'<cfelse>NULL</cfif> ,<cfif IsDefined("FORM.textfield3") AND #FORM.textfield3# NEQ "">'#FORM.textfield3#'<cfelse>NULL</cfif> )</cfquery>
수정된 보안 코드:
<cfquery datasource="cafetownsend"> INSERT INTO COMMENTS (FIRST_NAME, LAST_NAME, TELEPHONE) VALUES<cfif IsDefined("FORM.textfield1") AND #FORM.textfield1# NEQ ""><cfqueryparam value="#FORM.textfield1#" cfsqltype="cf_sql_clob" maxlength="50"><cfelse>''</cfif> ,<cfif IsDefined("FORM.textfield2") AND #FORM.textfield2# NEQ ""><cfqueryparam value="#FORM.textfield2#" cfsqltype="cf_sql_clob" maxlength="50"><cfelse>''</cfif> ,<cfif IsDefined("FORM.textfield3") AND #FORM.textfield3# NEQ ""><cfqueryparam value="#FORM.textfield3#" cfsqltype="cf_sql_clob" maxlength="20"><cfelse>''</cfif> )</cfquery>
참고: 데이터에 해당하는 cfslqtype 및 maxlength 값을 선택합니다.
레코드 업데이트 및 레코드 업데이트 양식 마법사
레코드 업데이트 서버 동작 및 Record Update Form Wizard는 위의 수정 사항을 조합해야 합니다. 먼저 SQL SELECT 문장이 포함된 cfquery를 찾아 필터가 있는 레코드세트에 설명된 대로 수정합니다. 먼저 SQL UPDATE 문장이 포함된 cfquery를 찾아 레코드 삽입 서버 동작 및 Record Insertion Form Wizard에 설명된 대로 수정합니다.
레코드 삭제 서버 비헤이비어
레코드 삭제 서버 비헤이비어 수정은 필터가 있는 레코드세트에 대한 수정과 유사합니다.
원본 코드:
<cfquery datasource="cafetownsend"> DELETE FROM COMMENTS WHERE COMMENT_ID=#URL.COMMENT_ID#</cfquery>
수정된 보안 코드:
<cfquery datasource="cafetownsend"> DELETE FROM COMMENTS WHERE COMMENT_ID=<cfqueryparam value="#URL.COMMENT_ID#" cfsqltype="cf_sql_numeric"></cfquery>
참고: 데이터에 해당하는 cfslqtype 및 maxlength 값을 선택합니다.
사용자 로그인 서버 비헤이비어
사용자 로그인 서버 비헤이비어를 수정하려면 cfquery 태그를 찾아 cfqueryparam 태그를 추가합니다.
원본 코드:
<cfquery name="MM_rsUser" datasource="cafetownsend"> SELECT FIRST_NAME,LAST_NAME FROM COMMENTS WHERE FIRST_NAME='#FORM.textfield1#' AND LAST_NAME='#FORM.textfield2#'</cfquery>
수정된 보안 코드:
<cfquery name="MM_rsUser" datasource="cafetownsend"> SELECT FIRST_NAME,LAST_NAME FROM COMMENTS WHERE FIRST_NAME=<cfqueryparam value="#FORM.textfield1#" cfsqltype="cf_sql_clob" maxlength="50"> AND LAST_NAME=<cfqueryparam value="#FORM.textfield2#" cfsqltype="cf_sql_clob" maxlength="50"></cfquery>
참고: 데이터에 해당하는 cfslqtype 및 maxlength 값을 선택합니다.
새 사용자 확인 서버 비헤이비어
새 사용자 확인 서버 비헤이비어는 먼저 레코드 삽입 서버 동작을 페이지에 추가해야 합니다. 먼저 SQL SELECT 문장이 포함된 cfquery를 찾아 필터가 있는 레코드세트에 설명된 대로 수정합니다. 먼저 SQL INSERT 문장이 포함된 cfquery를 찾아 레코드 삽입 서버 동작 및 Record Insertion Form Wizard에 설명된 대로 수정합니다.
마스터 세부 정보 페이지 세트
마스터 세부 정보 페이지 세트 애플리케이션의 경우 변경 사항은 주로 Dreamweaver가 상세 페이지에 대해 생성한 레코드 집합에 있습니다. 마스터 페이지에 필터링된 레코드 집합이 없는 경우 마스터 페이지를 변경할 필요가 없습니다. 마스터 페이지에 필터링된 레코드 집합이 있는 경우 필터가 있는 레코드세트를 참조하여 레코드 집합 코드를 업데이트할 수 있습니다.
상세 페이지의 경우, SQL SELECT 문장이 포함된 cfquery를 찾아 필터가 있는 레코드세트에 설명된 대로 수정합니다.
추가 정보
인증되지 않은 사용자로부터 데이터베이스의 보안을 유지하려면 모든 cfquery 태그 내에서 cfqueryparam 태그를 사용하는 것이 좋습니다. 자세한 내용은 다음 리소스를 참조하십시오.