私は主にCFQUERYPARAM
SQL インジェクションを防ぐために使用します。Query-of-Queries (QoQ) はデータベースに触れないので、CFQUERYPARAM を使用する論理的な理由はありますか? cfsqltype
andに一致しない値がmaxlength
例外をスローすることはわかっていますが、これらの値はその前に検証済みであり、わかりやすいメッセージを表示する必要があります (UX の観点から)。
2 に答える
Query-of-Queries (QoQ) はデータベースに触れないので、CFQUERYPARAM を使用する論理的な理由はありますか? 実際、それはデータベース、現在メモリに保存されているデータベースに影響を与えます。そのデータベースのデータは、理論的には、ユーザーからの何らかの注入によって改ざんされる可能性があります。それは物理データベースに影響しますか - いいえ。それはアプリケーション内でのデータの使用に影響しますか - はい。
あなたは具体的な詳細を教えてくれませんでしたが、私は用心のために過ちを犯します。クエリを作成するために使用しているデータのいずれかがクライアントからのものである場合は、それらを使用しcfqueryparam
ます。クエリの要素がクライアントからのものではないことを保証できる場合は、cfqueryparam
.
余談ですが、使用cfqueryparam
すると、データベースのクエリを最適化するのにも役立ちますが、それがクエリのクエリに当てはまるかどうかはわかりません。また、アポストロフィなどの文字をエスケープします。
私の意見では、これはより単純な状況です。
<cfquery name="NoVisit" dbtype="query">
select chart_no, patient_name, treatment_date, pr, BillingCompareField
from BillingData
where BillingCompareField not in
(<cfqueryparam cfsqltype="cf_sql_varchar"
value="#ValueList(FinalData.FinalCompareField)#" list="yes">)
</cfquery>
別の方法は、QuotedValueList を使用することです。ただし、その値リストにアポストロフィが含まれている場合、cfqueryparam はそれをエスケープします。そうでなければ、私はしなければならないでしょう。
ここから編集開始
クエリ パラメータを使用しないとエラーが発生する別の例を次に示します。
QueryAddRow(x,2);
QuerySetCell(x,"dt",CreateDate(2001,1,1),1);
QuerySetCell(x,"dt",CreateDate(2001,1,11),2);
</cfscript>
<cfquery name="y" dbtype="query">
select * from x
<!---
where dt in (<cfqueryparam cfsqltype="cf_sql_date" value="#ValueList(x.dt)#" list="yes">)
--->
where dt in (#ValueList(x.dt)#)
</cfquery>
書かれたコードはこのエラーをスローします:
Query Of Queries runtime error.
Comparison exception while executing IN.
Unsupported Type Comparison Exception:
The IN operator does not support comparison between the following types:
Left hand side expression type = "DATE".
Right hand side expression type = "LONG".
上記でコメント化されたクエリ パラメータを使用すると、コードは正常に実行されます。