PDO MySQL: PDO::ATTR_EMULATE_PREPARES によるパフォーマンスとセキュリティのバランス
概要
PDO のプリペアド ステートメント エミュレーションを使用するかの選択(PDO::ATTR_EMULATE_PREPARES) かどうかは議論の対象となっています。この問題を明らかにするために、この記事ではパフォーマンスとセキュリティに関連する一般的な懸念事項に対処します。
パフォーマンスに関する考慮事項
-
主張 1: PDO の準備されたエミュレーションは、MySQL のネイティブの準備がクエリをバイパスするため、パフォーマンスを向上させます。キャッシュ。
応答: この主張は古いです。 MySQL バージョン 5.1.17 以降では、クエリ キャッシュ内のプリペアド ステートメントがサポートされており、パフォーマンス上の利点とセキュリティの両方が可能になります。
-
追加注: ネイティブのプリペアド ステートメントでは、ワンタイム クエリのオーバーヘッドが高くなる可能性があります。エミュレートされた準備済みステートメントと比較します。ただし、プリペアド ステートメント オブジェクトが再利用される場合、ネイティブのプリペアド ステートメントにより全体的な実行速度が向上します。
セキュリティに関する考慮事項
-
クレーム 2: MySQL のネイティブ Prepare はセキュリティに優れており、SQL を阻止します。 jection.
Response: どちらのメソッドも、クエリ パラメータをエスケープすることで SQL インジェクションに対する保護を提供します。 PDO はライブラリでの準備をエミュレートし、ネイティブの準備は MySQL サーバーで行われますが、どちらも安全なクエリになります。
エラー報告
-
主張 3: MySQL のネイティブの準備によりエラーが改善されるreports.
応答: 確かに、ネイティブの準備では準備時に構文エラーが発生する可能性があります。逆に、エミュレートされた準備では、実行時にのみ構文エラーが明らかになる可能性があります。これには、特に PDO::ERRMODE_EXCEPTION を使用する場合に注意が必要です。
最近の MySQL バージョン
プリペアド ステートメントをサポートする MySQL バージョン 5.1.17 以降クエリ キャッシュでは、エミュレーションを無効にすることをお勧めします (PDO::ATTR_EMULATE_PREPARES = 間違い)。これにより、パフォーマンスとセキュリティの両方の利点が得られます。
追加の考慮事項
-
コードの変更: エミュレーションを無効にすると、特にコード構造に影響を与えることに注意してください。使用するときPDO::ERRMODE_EXCEPTION.
-
最適化された PDO 接続用の関数: 便宜上、古い PHP バージョンの文字エンコーディングの処理など、最適な設定を行うサンプル PDO 接続関数が提供されています。
以上がPDO MySQL: プリペアドステートメントをエミュレートするかどうか?パフォーマンスとセキュリティへの影響の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。