PDO プリペアド ステートメントはテーブル名と列名、または SQL キーワードをバインドできますか?

Mary-Kate Olsen
リリース: 2024-11-24 10:25:12
オリジナル
535 人が閲覧しました

Can PDO Prepared Statements Bind Table and Column Names, or SQL Keywords?

PDO プリペアド ステートメントは識別子または構文キーワードをバインドできますか?

テーブル、フィールドを表す変数を使用して動的クエリを構築しようとしています/column と検索する値を指定すると、PDO のプリペアド ステートメントを使用するときに予期しない問題が発生する可能性があります。具体的には、bindParam() または bindingValue() を使用してこれらの変数をバインドすると、結果セットが空になる可能性があります。

問題の核心を掘り下げるには、PDO プレースホルダーがデータ リテラルを表すように指定されていることを理解することが重要です。したがって、これらを識別子 (テーブル名やフィールド名など) または構文キーワード (「LIKE」など) として使用しようとすると、誤った動作が発生する可能性があります。

具体的には、PDO はバインディング識別子に対する固有のサポートを提供しません。 . これは、開発者がこれらの識別子を自分で処理する責任を負わなければならないことを意味します。適切な実行を確保するには、次のような厳格なルールに従う必要があります。

識別子のバインディングのルール:

  1. 識別子はバッククォートで囲みます。
  2. 識別子内のバッククォートを二重化してエスケープする

これらの書式設定ルールにより、構文エラーと SQL インジェクションの脆弱性が防止されます。

構文キーワードをバインドするためのルール:

  1. キーワードの書式設定は使用できません。ホワイトリストは有効です。重要です。
  2. 任意のキーワード置換を防ぐために、動的キーワードが許可された値のリストと一致していることを確認してください。

例:

次のことを考慮してください。前述のルールに準拠したコード スニペット:

$allowed = array("name", "price", "qty");
$key = array_search($_GET['field'], $allowed);
$field = $allowed[$key];
$query = "SELECT $field FROM t"; // Value is safe
ログイン後にコピー

要約すると、 PDO プリペアド ステートメントはデータ リテラルのバインディングには優れていますが、バインディング識別子や構文キーワードはサポートされていません。概要を示したルールに注意深く従うことで、開発者はこれらの重要なコンポーネントを利用する動的クエリを安全かつ正確に実行できます。

以上がPDO プリペアド ステートメントはテーブル名と列名、または SQL キーワードをバインドできますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート