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

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

Can I Bind Identifiers and Keywords in PHP PDO Prepared Statements?

PHP PDO プリペアド ステートメントのバインディング識別子と構文キーワード

動的クエリでは、変数を利用してテーブル名、列を定義することで柔軟なデータベース操作が可能名前と検索値。ただし、PDO プリペアド ステートメントを使用して識別子 (テーブル名またはフィールド名) または構文キーワードをバインドすると、予期しない結果が生じる可能性があります。

問題:

bindParam() または bindingValue を使用する場合() 識別子または構文キーワードを表す変数をバインドすると、予期されるデータベースの代わりに空の配列が返されます。 results.

説明:

PDO プリペアド ステートメントはデータ リテラルのみをバインドできます。したがって、識別子またはキーワードをバインドしようとしても、望ましい結果は得られません。

解決策:

安全で信頼性の高い動的クエリを作成するには、次のことが重要です。

  • 識別子を適切にフォーマットします: で囲みますバッククォート (') で識別子を指定し、バッククォートを 2 つ重ねる (```) ことで内部のバッククォートをエスケープします。
  • ホワイトリストを使用する: 潜在的なインジェクションを防ぐために、許可された値のハードコードされたリストに対して動的識別子を検証します。
  • 同じルールを構文キーワードに適用します: ホワイトリストと動的クエリで使用されるすべての構文キーワードを検証します。

コード例:

識別子のフォーマットと検証を行うには:

$field = "`" . str_replace("`", "``", $field) . "`";
ログイン後にコピー

ホワイトリストに登録してキーワードを検証します:

$dir = $_GET['dir'] == 'DESC' ? 'DESC' : 'ASC'; 
ログイン後にコピー

次に、サニタイズされた変数をプリペアド ステートメントに含めます:

$stmt = $db->prepare('
    SELECT 
        * 
    FROM 
        ?
    WHERE 
        ? LIKE ?
');
$stmt->bindParam(1, $searchTable);
$stmt->bindParam(2, $searchBy);
$stmt->bindValue(3, '%' . $searchTerm . '%');
ログイン後にコピー

これらのルールに従うことで、動的データベース クエリの有効性とセキュリティを確保できます。

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

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