cfqueryparam によるセキュリティの強化

DBMS(Database Management System)の中には、1 回のクエリで複数の SQL 文を送信できるものがあります。この場合、ハッカーが悪意のある SQL 文を既存のパラメーターの後に追加して、ダイナミックなクエリで URL やフォーム変数を改変するおそれがあります。クエリ文字列にパラメーターを渡すときは、潜在的なセキュリティリスクに十分に注意してください。このようなリスクは、ColdFusion、ASP、CGI などの多くの開発環境に存在する可能性があります。タグ cfqueryparam  を使用すると、このリスクを軽減できます。

クエリ文字列のパラメーターについて

クエリ文字列にパラメーターを渡している場合は、意図した情報のみが渡されるように対策が必要です。たとえば、次の ColdFusion クエリには WHERE 節が含まれています。これは、フォームの LastName フィールドで指定された姓に一致するデータベースエントリのみを選択するために使用されています。

<cfquery name=&quot;GetEmployees&quot; datasource=&quot;cfdocexamples&quot;> 
SELECT FirstName, LastName, Salary 
FROM Employee 
WHERE LastName='#Form.LastName#' 
</cfquery>

次のような悪質な URL を使用して、このページを呼び出すことができます。
http://myserver/page.cfm?Emp_ID=7%20DELETE%20FROM%20Employee
その結果、ColdFusion は以下のクエリを実行しようとします。

<cfquery name=&quot;GetEmployees&quot; datasource=&quot;cfdocexamples&quot;> 
SELECT * FROM Employee 
WHERE Emp_ID = 7 DELETE FROM Employee 
</cfquery>

Emp_ID 列の整数値だけでなく、SQL 文として実行可能な悪意のある文字列コードも渡されています。このクエリが正常に実行されると、Employee テーブルからすべての行が削除されます。このような操作が行えるのは明らかに望ましくありません。これを防ぐには、クエリ文字列のパラメーターの内容を評価します。

cfqueryparam の使用

次の用途で cfqueryparam  タグを使用して、クエリ文字列のパラメータを評価し、SQL 文内で ColdFusion 変数を渡すことができます。このタグは、変数の値をデータベースに送信する前に評価します。対応するデータベース列のデータタイプを指定するには、 cfsqltype 属性で指定された cfqueryparam   タグを使用して行うことができます。次の例では、 cfdocexamples データソースの Emp_ID 列が整数のため、cf_sql_integer の cfsqltype  を指定します。

<cfquery name=&quot;EmpList&quot; datasource=&quot;cfdocexamples&quot;> 
SELECT * FROM Employee 
WHERE Emp_ID = <cfqueryparam value = &quot;#Emp_ID#&quot; 
cfsqltype = &quot;cf_sql_integer&quot;> 
</cfquery>

一方、 cfqueryparam   タグによって、Emp_ID の値が整数のデータ型であることが確認されます。クエリ文字列に整数以外のもの(テーブルを削除する SQL 文など)が含まれている場合、 cfquery タグは実行されません。代わりに、 cfqueryparam   タグを指定すると、次のエラーメッセージが表示されます。
'CF_SQL_INTEGER' に対するデータ '7 DELETE FROM Employee' は無効です。

文字列に対する cfqueryparam の使用

文字列を含む変数をクエリに渡すときには、次の例のように cfsqltype の値として cf_sql_char を指定し、maxLength 属性を指定します。

<cfquery name = &quot;getFirst&quot; dataSource = &quot;cfdocexamples&quot;> 
SELECT * FROM employees 
WHERE LastName = <cfqueryparam value = &quot;#LastName#&quot; 
cfsqltype = &quot;cf_sql_char&quot; maxLength = &quot;17&quot;> 
</cfquery>

この場合、 cfqueryparam  は、以下のチェックを実行します。

  • LastName が文字列を含んでいることが確認されます。
  • 文字列が 17 文字以下であることが確認されます。
  • 単一の値としてデータベースに認識されるように、文字列が単一引用符 (') で囲まれてエスケープされます。ハッカーが悪意のある URL を渡した場合でも、次のんように処理されます。 follows:WHERE  LastName = 'Smith DELETE FROM MyCustomerTable'.

cfSqlType の使用

次の表に、 cfqueryparam  タグの value 属性を評価する際に利用可能な SQL タイプをリストします。

BIGINT

BIT

CHAR

DATE

DECIMAL

DOUBLE

FLOAT

IDSTAMP

INTEGER

LONGVARCHAR

MONEY

MONEY4

NUMERIC

REAL

REFCURSOR

SMALLINT

TIME

TIMESTAMP

TINYINT

VARCHAR

注意:

cfsqltype 属性を指定すると、DBMS でバインド変数が使用され、これによってパフォーマンスが大幅に向上する場合があります。

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

新規ユーザーの場合

Adobe MAX 2025

Adobe MAX Japan
クリエイターの祭典

2025 年 2 月 13 日
東京ビッグサイト