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 でバインド変数が使用され、これによってパフォーマンスが大幅に向上する場合があります。