BIGINT
DBMS(Database Management System)の中には、1 回のクエリで複数の SQL 文を送信できるものがあります。この場合、ハッカーが悪意のある SQL 文を既存のパラメーターの後に追加して、ダイナミックなクエリで URL やフォーム変数を改変するおそれがあります。クエリ文字列にパラメーターを渡すときは、潜在的なセキュリティリスクに十分に注意してください。このようなリスクは、ColdFusion、ASP、CGI などの多くの開発環境に存在する可能性があります。タグ cfqueryparam を使用すると、このリスクを軽減できます。
クエリ文字列のパラメーターについて
クエリ文字列にパラメーターを渡している場合は、意図した情報のみが渡されるように対策が必要です。たとえば、次の ColdFusion クエリには WHERE 節が含まれています。これは、フォームの LastName フィールドで指定された姓に一致するデータベースエントリのみを選択するために使用されています。
<cfquery name="GetEmployees" datasource="cfdocexamples"> 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="GetEmployees" datasource="cfdocexamples"> 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="EmpList" datasource="cfdocexamples"> SELECT * FROM Employee WHERE Emp_ID = <cfqueryparam value = "#Emp_ID#" cfsqltype = "cf_sql_integer"> </cfquery>
一方、 cfqueryparam タグによって、Emp_ID の値が整数のデータ型であることが確認されます。クエリ文字列に整数以外のもの(テーブルを削除する SQL 文など)が含まれている場合、 cfquery タグは実行されません。代わりに、 cfqueryparam タグを指定すると、次のエラーメッセージが表示されます。
'CF_SQL_INTEGER' に対するデータ '7 DELETE FROM Employee' は無効です。
文字列に対する cfqueryparam の使用
文字列を含む変数をクエリに渡すときには、次の例のように cfsqltype の値として cf_sql_char を指定し、maxLength 属性を指定します。
<cfquery name = "getFirst" dataSource = "cfdocexamples"> SELECT * FROM employees WHERE LastName = <cfqueryparam value = "#LastName#" cfsqltype = "cf_sql_char" maxLength = "17"> </cfquery>
この場合、 cfqueryparam は、以下のチェックを実行します。
- LastName が文字列を含んでいることが確認されます。
- 文字列が 17 文字以下であることが確認されます。
- 単一の値としてデータベースに認識されるように、文字列が単一引用符 (') で囲まれてエスケープされます。ハッカーが悪意のある URL を渡した場合でも、次のんように処理されます。 follows:WHERE LastName = 'Smith DELETE FROM MyCustomerTable'.
cfSqlType の使用
次の表に、 cfqueryparam タグの value 属性を評価する際に利用可能な SQL タイプをリストします。
|
BIT |
CHAR |
DATE |
---|---|---|---|
DECIMAL |
DOUBLE |
FLOAT |
IDSTAMP |
INTEGER |
LONGVARCHAR |
MONEY |
MONEY4 |
NUMERIC |
REAL |
REFCURSOR |
SMALLINT |
TIME |
TIMESTAMP |
TINYINT |
VARCHAR |
cfsqltype 属性を指定すると、DBMS でバインド変数が使用され、これによってパフォーマンスが大幅に向上する場合があります。