5

cfqueryparam私たちは、SQL クエリで宗教的に使用します。

私の前任者の何人かは、変数ではなく直接値で使用する場合、少し熱心すぎたようです。

ではない

record_is_deleted_bt = <cfqueryparam cfsqltype="cf_sql_bit" value="0">

やり過ぎ?つまり、SQL インジェクションの可能性はありません。ここでバインド変数を使用しても、データベースのパフォーマンスが向上するとは思えません。そうするのも同じくらい合理的ではないでしょうか

record_is_deleted_bt = 0

?

cfqueryparamそれを使用する習慣を根付かせる以外に、そのような場合に使用する利点はありますか? デメリットはありますか?

4

1 に答える 1

4

いいえ、これはやり過ぎではありません。cfqueryparam の最初の仕事はデータ バインディングです。SQLインジェクションの防止に役立ちますが、アドオンボーナスです。データ バインディングによる準備済みステートメントは、より高速に実行されます。SQL攻撃の防止のみを支援するためにあると考えるのは間違っています。
重要な注意: オラクル データベースで @Dan Bracuk によって提供されたテスト ケースを追加しています。

<cfquery name="without" datasource="burns">
select count(*)
from burns_patient
where patientid = 1
</cfquery>

<cfquery name="with" datasource="burns">
select count(*)
from burns_patient
where patientid = <cfqueryparam cfsqltype="cf_sql_integer" value="1">
</cfquery>

<cfscript>
TotalWithout = 0;
TotalWith = 0;
</cfscript>

<cfloop from="1" to="1000" index="i" step="1">

  <cfquery name="without" datasource="burns" result="resultwithout">
    select count(*)
    from burns_patient
    where patientid = 1
  </cfquery>

  <cfquery name="with" datasource="burns" result="resultwith">
    select count(*)
    from burns_patient
    where patientid = <cfqueryparam cfsqltype="cf_sql_integer" value="1">
  </cfquery>

  <cfscript>
    TotalWithout += resultwithout.executiontime;
    TotalWith += resultwith.executiontime;
  </cfscript>

</cfloop>

<cfdump var="With total is #TotalWith# and without total is #TotalWithout#.">

with total の範囲は合計 700 ~ 900 ミリ秒です。合計なしの範囲は 1800 ~ 4500 ミリ秒です。合計なしは常に、合計ありの少なくとも 2 倍です。

于 2014-10-01T13:22:48.503 に答える