PDO プリペアド ステートメントを使用する場合、プレースホルダーはデータ リテラルのみを表すことができることに注意することが重要です。これは、bindParam() または bindingValue() を使用して識別子 (テーブル名またはフィールド名) または構文キーワードをバインドしようとすると、予期しない動作が発生することを意味します。
動的を使用する場合テーブル名またはフィールド名を動的に指定するクエリの場合、識別子のバインドを慎重に処理することが重要です。 PDO はバインディング識別子を直接サポートしません。したがって、開発者は、セキュリティを確保し、インジェクション攻撃を防ぐために、識別子を手動でフォーマットおよび検証する必要があります。
識別子を安全にフォーマットするには、次のルールに従ってください:
フォーマットしたら、誤用を防ぐために、許可された値のハードコーディングされたホワイトリストと照合して識別子をチェックします。
同様に、バインディング構文キーワード、 'ORDER BY' または 'DESC' は PDO ではサポートされていません。開発者は、悪意のある入力によってクエリの動作が変更されるのを防ぐために、キーワードを手動で検証してホワイトリストに登録する必要があります。
次のコードは、文字列の書式設定とホワイトリストを使用して動的識別子とキーワードを処理する方法を示しています。
$field = "`" . str_replace("`", "``", $_GET['field']) . "`"; $dir = $_GET['dir'] == 'DESC' ? 'DESC' : 'ASC'; $sql = "SELECT $field FROM t ORDER BY field $dir";
この例では、動的フィールド名はバッククォートで囲まれ、必要に応じてエスケープされます。並べ替え方向は、悪意のある入力によってクエリが変更されるのを防ぐために、ホワイトリストに対して検証されます。
これらのガイドラインに注意深く従うことで、開発者は、セキュリティを維持し、インジェクション攻撃を防止しながら、動的な識別子とキーワードを含む PDO 準備済みステートメントを使用できます。
以上が動的識別子とキーワードを含む PDO プリペアド ステートメントを安全に使用するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。