2012-01-07 3 views
3

최근 양식 제출을 통해 SQL 데이터베이스에 데이터를 삽입하는 방법은 SQL 주입 공격의 대상이되며 보안 강화를위한 조언이 필요하다고 언급되었습니다. CleanPhoneNumber이 방법 설정데이터를 데이터베이스에 입력 : SQL injection 방지

 <cfquery name="InsRegistrant" datasource="#application.Datasource#" dbtype="odbc"> 

      INSERT INTO Schedule_Registrations(
       schedule_id, 
       first_name, 
       last_name, 
       phone_number, 
       email, 
       guest, 
       list_type, 
       datetime_registered 
      ) 
      VALUES(
       #url.schedule_id#, 
       '#FORM.first_name#', 
       '#FORM.last_name#', 
       '#CleanPhoneNumber#', 
       '#FORM.email#', 
       #attendee.guest#, 
       <!--- Values for list types 
        0 = NEVER USE Will cause many many problems 
        1 = Main List 
        2 = Waiting List --->      
       #attendee.list_type#, 
       #createodbcdatetime(now())# 
      )     
     </cfquery> 

: 여기

는 DB에 양식 데이터를 삽입하는 코드입니다,

<cfset CleanPhoneNumber = REReplace(form.phone_number, "[^0-9]", "", "ALL") /> 

내가 예를 들어, 사용하는 들었다을

<cfqueryparam cfsqltype="cf_sql_varchar" value="#form.phone_number#" /> 

하지만 대체 할 부분과 위치를 잘 모르겠습니다. 그런 값으로 바꾸면 오류가납니다.

어떤 방향이 도움이 될 것입니다 ..

+0

참고하시기 바랍니다.

답변

5

당신은 같을 것이다 cfqueryparam

귀하의 질의에있는 모든 형태와 URL 변수를 포장한다 :

<cfquery name="InsRegistrant" datasource="#application.Datasource#" dbtype="odbc"> 
    INSERT INTO Schedule_Registrations(
     schedule_id, 
     first_name, 
     last_name, 
     phone_number, 
     email, 
     guest, 
     list_type, 
     datetime_registered 
    ) 
    VALUES(
     <cfqueryparam cfsqltype="cf_sql_integer" value="#url.schedule_id#">, 
     <cfqueryparam cfsqltype="cf_sql_varchar" value="#FORM.first_name#">, 
     <cfqueryparam cfsqltype="cf_sql_varchar" value="#FORM.last_name#">, 
     <cfqueryparam cfsqltype="cf_sql_varchar" value="#CleanPhoneNumber#">, 
     <cfqueryparam cfsqltype="cf_sql_varchar" value="#FORM.email#">, 
     <cfqueryparam cfsqltype="cf_sql_integer" value="#attendee.guest#">, 
     <!--- Values for list types 
      0 = NEVER USE Will cause many many problems 
      1 = Main List 
      2 = Waiting List --->      
     <cfqueryparam cfsqltype="cf_sql_integer" value="#attendee.list_type#">, 
     #createodbcdatetime(now())# 
    )     
</cfquery> 

나는 모든 데이터 유형이 올바른지있어 확실하지 않다, 모든 데이터 유형에 대해서는 full documentation of cfqueryparam을 참조하십시오.

+0

그게 내가 생각하고 있던 기본적인 접근 방식이지만 구문의 일부가 잘못되었다. 위대한 작품, 감사합니다! – Nietzsche

+0

일반적으로 ColdFusion의 데이터 소스는 CFQuery 당 하나의 SQL 문만 허용하므로 Sql 주입 공격에도 도움이됩니다. Cfqueryparam은 확실히 작업을 강화하지만 현재는 사이트 간 스크립팅 공격에 취약하다는 사실을 알고 있어야합니다. 양식을 제출하기 전에 양식 제출물을 sanatise해야합니다. –

+0

명확히하기 위해 데이터베이스 유형과 드라이버는 cfquery에서 여러 명령문을 실행할 수 있는지 여부를 결정합니다. MySQL은 다중 명령문을 지원하지만, 커넥터/j 드라이버 (CF에서 사용)는 기본적으로 이들을 비활성화합니다 *. MS SQL 드라이버는 기본적으로 * enabled * 상태를 유지하지만 쿼리는 위험합니다. 그래서 그것은 달려 있습니다. 그러나 다른 사람들이 말한 것처럼 가장 안전한 방법은 방어 적으로 코드를 작성하고 항상 cfqueryparam을 사용하는 것입니다. – Leigh

0

당신이 할 수있는 몇 가지 모범 사례가 있습니다.

당신이 할 수있는 일 중 하나를 제공 한 삽입 코드는 데이터를 삽입하기 전에 명시 적으로 양식 필드의 입력을 확인하는 것입니다. 공백 및 " '와 같은 것을 확인하십시오. 또한 입력 한 잘못된 데이터로 인한 오류 메시지가 사용자에게 표시되지 않도록해야합니다. 이는 테이블 구조를 알고 자하는 누군가에게 유용합니다.

그렇지 않으면 삽입 또는 업데이트를 위해 저장 프로 시저를 호출하기 전에 삽입 프로 시저에 삽입을 배치하고 입력 매개 변수의 유효성을 검사하십시오.

다음은 SQL 주입 공격을 막기 위해 수행 할 수있는 좋은 목록입니다. 그것은 asp.net과 관련이 있지만 개념은 여전히 ​​당신이 사용하는 언어에 상관없이 적용됩니다.

How To: Protect From Injection Attacks in ASP.NET

+0

죄송합니다. 나는 이것을 codefusion에 명시 적으로 적용하지 않았습니다. 아래에 나와있는 답변이 도움이 될 것 같습니다. 그의 제안을 설명하는 링크가 있습니다. http://kb2.adobe.com/cps/300/300b670e.html – SoftwareCarpenter

+0

그럼에도 불구하고 좋은 정보가 있습니다. – Nietzsche

관련 문제