アップデート:
これはあなたの質問の一部に答えますが、「CF が単一引用符をエスケープして保護を自動的に追加するのに、なぜ cfqueryparam を使用するのですか?」という質問に直接対処するという点で、 Peter の回答の方が優れています。回答: 要するに、後者が常に機能するとは限らないためです。変数をバインドします。
ドキュメントには「一重引用符で文字列変数をエスケープする」と書かれていますが、評価された変数を一重引用符で囲むと、CFはすでに「魔法のように」CFクエリタグでこれを行っていませんか?
はい、ほとんどのバージョンでは、cfqueryparam を使用しない場合の保護手段として、単一引用符が自動的にエスケープされます。ただし、Scott が前述したように、cfqueryparam (バインド変数) を使用することをお勧めします。これは、パラメーターがsql コマンドとして実行されないようにするためです。ピーターの答えが示すように、自動エスケープが機能しない場合でも、バインド変数は機能します。
つまり、SQL インジェクション保護は、実際にはバインド変数を使用することの副作用にすぎません。バインド変数を使用する主な理由はパフォーマンスです。変数をバインドすると、#parameters# が変更されるたびに新しいプランを作成するのではなく、データベースがクエリ プランを再利用するようになります。これにより、コンパイル時間が短縮され、パフォーマンスが向上します。
Cfqueryparam には他にも多くの利点があります。
- データ型チェック (長さ、値、型など) を提供します
- 「リスト」と
null
値の処理を簡素化する属性を提供します
- SQL がデータベースに送信される前にデータ型チェックを実行し、無駄なデータベース呼び出しを防ぎます。
文字列列には実際には適用されませんが、IMO を使用するもう 1 つの大きな理由は精度です。引用符で囲まれた文字列をデータベースに渡す場合、暗黙的な変換に依存しています。基本的に、比較を最適に実行する方法をデータベースに任せているため、結果が常に期待どおりになるとは限りません。(日付文字列が代表的な例です)。データベースがどのように SQL を実行するかによって、結果が不正確になったり、クエリが遅くなったりする可能性があります。cfqueryparam を使用すると、あいまいさがなくなり、これらの問題が回避されます。