パラメータ化されたクエリとは何か、SQL インジェクションを回避するために MySQL データベース用に PHP に実装する方法を平易な英語で説明できる人はいますか?
1 に答える
PHP マニュアルのプリペアド ステートメントとストアド プロシージャのセクションでは、特に PDO に関連していますが、次のように説明されています。
これらは、アプリケーションが実行したい SQL の一種のコンパイル済みテンプレートと考えることができ、変数パラメーターを使用してカスタマイズできます。プリペアド ステートメントには、次の 2 つの主な利点があります。
クエリは 1 回だけ解析 (または準備) する必要がありますが、同じまたは異なるパラメーターを使用して複数回実行できます。クエリが準備されると、データベースはクエリを実行するための計画を分析、コンパイル、最適化します。複雑なクエリの場合、同じクエリを異なるパラメーターで何度も繰り返す必要がある場合、このプロセスに時間がかかり、アプリケーションの速度が著しく低下する可能性があります。プリペアド ステートメントを使用することで、アプリケーションは分析/コンパイル/最適化のサイクルを繰り返さなくなります。これは、プリペアド ステートメントが使用するリソースが少なくなるため、実行速度が速くなることを意味します。
準備済みステートメントのパラメーターは引用符で囲む必要はありません。ドライバーはこれを自動的に処理します。アプリケーションがプリペアド ステートメントのみを使用する場合、開発者は SQL インジェクションが発生しないことを確認できます (ただし、クエリの他の部分がエスケープされていない入力で構築されている場合、SQL インジェクションは依然として可能です)。
それらの使用方法の具体的な例を知りたい場合は、上記のリンクされたページにコード サンプルも含まれています。