ColdFusion サーバービヘイビアーを SQL インジェクションの脆弱性から保護する

Dreamweaver の ColdFusion サーバービヘイビアーを SQL インジェクション攻撃から保護します。

SQL インジェクション攻撃のセキュリティリスク

一部のデータベースでは、1 つのクエリで複数の SQL ステートメントを送信できます。そのため、クエリ文字列のパラメータを動的に生成されたデータベースクエリに渡すと、セキュリティ上のリスクが発生する可能性があります。ハッカーは、悪意のある SQL ステートメントを既存のパラメータに追加して、動的クエリ内の URL 変数またはフォーム変数の改変を試みます。これが SQL インジェクション攻撃と呼ばれるものです。Dreamweaver で作成されるサーバービヘイビアーコードの一部は、SQL インジェクション攻撃のリスクを軽減するために変更する必要があります。SQL インジェクションのバックグラウンド情報の詳細は、こちらの Wikipedia の記事を参照してください。

メモ:この記事に記載されている問題は、Dreamweaver 8.0.2 アップデーターで修正済みです。

解決策:サーバービヘイビアーをアップデートする

クエリ文字列でパラメータを渡すときは、必ず、予期される情報のみを渡します。アドビでは、SQL インジェクション攻撃のリスクを軽減する Dreamweaver 8.0.2 アップデーターを作成しました。これらの修正は、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>

レコードの挿入サーバービヘイビアーとレコード挿入フォームウィザード

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 値を選択します。

レコードのアップデートとレコードアップデートフォームウィザード

レコードのアップデートサーバービヘイビアーとレコードアップデートフォームウィザードでは、上記の修正を組み合わせる必要があります。まず、SQL SELECT ステートメントが含まれる cfquery を探し、フィルター付きレコードセット にある説明に従って修正します。次に、SQL UPDATE ステートメントが含まれる cfquery を探して、レコードの挿入サーバービヘイビアーおよびレコード挿入フォームウィザード にある説明に従って修正します。

レコードの削除サーバービヘイビアー

レコードの削除サーバービヘイビアー修正は、フィルター付きレコードセットの修正と同様です。

元のコード:

<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 を探して、レコードの挿入サーバービヘイビアーおよびレコード挿入フォームウィザード にある説明に従って修正します。

マスター詳細ページセット

マスター詳細ページセットアプリケーションオブジェクトの場合、変更は主に、Dreamweaver が詳細ページ向けに作成するレコードセットに行われます。マスターページにフィルター処理したレコードセットがない場合は、マスターページの変更は必要ありません。マスタページにフィルター処理したレコードセットがある場合は、フィルター付きレコードセットを参照してレコードセットコードをアップデートします。

詳細ページの場合は、SQL SELECT ステートメントが含まれる cfquery を探し、フィルター付きレコードセット にある説明に従って修正します。

追加情報

すべての cfquery タグ内で cfqueryparam タグを使用して、未承認のユーザーからデータベースを保護することをお勧めします。詳しくは、以下を参照してください。

ヘルプをすばやく簡単に入手

新規ユーザーの場合