SQL プリペアド ステートメントとテーブル名: よくある落とし穴
プリペアド ステートメントは安全な SQL クエリにとって重要であり、SQL インジェクションの脆弱性を防ぎます。 ただし、よくある誤解は、プリペアド ステートメント内でテーブル名をパラメータ化できるということです。 これは誤りです。
次の例は、この問題を示しています。準備されたステートメントを使用して、パラメータ (query1
) と [?]
のような変数を使用してテーブル名 (reportDate
など) を動的に指定しようとすると、失敗します。 「テーブル名が必要な場所にパラメータ 'Pa_RaM000' が指定されました」というエラーは、この制限を強調しています。
解決策: プリペアドステートメントの外側での動的構築
中心的な問題は、SQL パーサーがテーブル名を他のクエリ パラメーターとは異なる方法で扱うことです。 これらは、準備されたステートメントのプレースホルダーを介して動的に挿入することはできません。
正しいアプローチには、準備されたステートメントが使用される前にテーブル名を動的に構築することが含まれます。 これは、日付部分を含む変数 (例: reportDate
) をテーブル名の固定部分と連結することで行われます:
<code class="language-sql">private String query1 = "SELECT plantID, edrman, plant, vaxnode FROM [" + reportDate + ".?]";</code>
ここで、reportDate
はテーブル名の日付固有の部分を提供し、静的な部分と結合されます。 SELECT
ステートメント内の残りのパラメーターは、準備されたステートメント自体内で安全にパラメーター化できます。
この方法では、データ値に対する準備されたステートメントのセキュリティ上の利点を維持しながら、動的なクエリの生成が可能になります。
以上がSQL でテーブル名にプリペアド ステートメントを使用できないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。