2012-01-07 20 views
3

最近、フォームの送信を経由して私たちのSQLデータベースにデータを挿入する手法は、SQLインジェクション攻撃の対象となり、そして私たちのセキュリティを強化するためにいくつかのアドバイスをしたいということを述べました。フォームデータ:防止SQLインジェクション

ここでDBにフォームデータを挿入するコードです:

 <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> 

CleanPhoneNumberがこのように設定されています

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

Iは、例えば、使用することが言われてきた、

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

が、私はどこ置き換えるとする内容がわかりません。そのような値で値を置き換えると、エラーが発生します。

任意の方向が参考になります。

+0

。私はdbtypeがあなたの

答えて

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を参照してください。 FYI

+0

それは私が考えていた基本的なアプローチですが、構文のいくつかが間違っていました。素晴らしい、ありがとう! – Nietzsche

+0

一般に、ColdFusionのデータソースでは、CFQueryごとに1つのSQL文のみが許可されるため、SQLインジェクション攻撃にも役立ちます。 Cfqueryparamは確実に物事を強化しますが、クロスサイトスクリプティング攻撃に対して脆弱であることに注意してください。あなたがそれらを表示する前に任意のフォーム提出物をサニタイズすることを確認してください。 –

+0

明確にするために、データベースタイプとドライバは、cfqueryで複数の文を実行できるかどうかを判断するものです。 MySQLは複数の文をサポートしていますが、CFで使用されるconnector/jドライバ*はデフォルトでは無効になっています。 MS SQLドライバはデフォルトで* enabled *のままですが、クエリは危険にさらされます。それはそれに依存します。しかし他の人のように、最も安全な方法は防衛的にコードを作成し、常にcfqueryparamを使うことです。 – Leigh

0

できることはいくつかあります。あなたはあなたができることの一つを提供している挿入コードの場合

は、明示的にスペースと「'」のようなもののためにdata.Checkを挿入する前に、フォームフィールドの入力を確認しています。また、入力した不良データからのエラーメッセージがユーザーに表示されないようにする必要があります。これは、あなたのテーブル構造を知りたい人には便利です。

そうでない場合は、ストアドプロシージャで挿入を配置し、挿入または更新のためのストアドプロシージャを呼び出す前に、入力パラメータを検証します。ここで

を使用すると、SQLインジェクション攻撃を防ぐために行うことができ、物事の良いリストです。これはasp.netに関連していますが、使用している言語に関係なく、コンセプトはそのまま適用されます。

How To: Protect From Injection Attacks in ASP.NET

+0

申し訳ありませんが、これはコードフュージョンに特有のものでした。下に示されている答えが役に立つと思われるようです。彼の提案を説明するリンクがあります。 http://kb2.adobe.com/cps/300/300b670e.html – SoftwareCarpenter

+0

それでも良い情報がありますが、ありがとうございます。 – Nietzsche

関連する問題