演習 2: ダイナミック SQL の使用時に起こりうるセキュリティリスクの回避

クライアントとデータベースサーバー間の往復を軽減するために、多くの SQL データベースサーバーは、クライアントが複数の SQL ステートメントをセミコロン (;) で区切って 1 つのリクエストとして送信することを認めています。このようなデータベース管理システムでは、次の SQL リクエストが有効です。

DELETE from trips where tripLocation = '中国'; SELECT tripName from trips

このリクエストは、データベース管理システムが中国旅行を削除した後に残った旅行をリストするには効率的な方法です。問題は、SQL ステートメントがダイナミックに作成されるときに発生します。

旅行メンテナンスアプリケーションでは、クライアントプログラムまたはユーザーが「Trip Detail」ページを呼び出す URL の中に ID を渡すと、ページには関連する旅行情報が表示されます。次のコードにより、この動作をサポートする正しい WHERE 節が作成されます。

<cfif IsDefined("URL.ID")>
   WHERE tripID = #URL.ID#
</cfif>

ユーザーが次のステートメントを使用して、「Trip Detail」ページを呼び出した場合、

http://localhost/cfdocs/getting_started/my_app/tripdetail.cfm?ID=24;DROP+trips

SQL データベース管理システムは適切な SQL SELECT ステートメントを実行し、その直後に、データベースから「Trips」テーブルを消去します。

アプリケーションの保護

アプリケーションを攻撃などから確実に保護するには、ID が数値でなければならないということを利用します。CFML Val 関数は文字列の式の先頭に、数値を返します。Val 関数は、次のように使用できます。

<cfif IsDefined("URL.ID")>
   WHERE tripID = #Val(URL.ID)#
</cfif>

数字以外のデータが URL ID フィールド内に渡されると、Val 関数は 0 を返し、ID が 0 の旅行 (存在する場合) が表示されます。ユーザーが前述の URL (http://localhost/cfdocs/getting_started/my_app/tripdetail.cfm?ID=24;DROP+trips) を入力すると、アプリケーションは数字以外の値を無視して、旅行 ID が 24 の旅行情報を表示します。

警告: このチュートリアルの演習では、ダイナミック SQL のリスクを考慮していません。このようなリスクを排除するには、ColdFusion の関数 (Val など) を使用して、タイプのチェックをすべての URL パラメータで実行する必要があります。クエリーでは cfqueryparam タグを使用することもできます。詳細については『CFML リファレンス』を参照してください。


ColdFusion MX 7 | ColdFusion MX 6.1 | ColdFusion MX* | ColdFusion 5* | フォーラム* | デベロッパーセンター | サポート情報 | バグ報告

バージョン7

 

このページに新しいコメントが追加された場合に、電子メールでの通知を希望する。 | コメントレポート

現在のページ: http://livedocs.adobe.com/coldfusion/7_jp/htmldocs/tripdet4.htm