ユーザーがクエリの制限を入力できるようにしたい。mysql構文の一部として、LIMIT
は引用符で囲むことはできず、数字とコンマを含めることができます。これを行うのは非常に簡単です:
preg_replace(/[^\d,]/, '', $request->post('limit'))
...ただし、衛生状態はDBクラスレベルで行われないため、これは安全ではありません。
パラメータではないクエリ(列名、制限量など)への入力をサニタイズする適切な方法は何ですか?
ユーザーがクエリの制限を入力できるようにしたい。mysql構文の一部として、LIMIT
は引用符で囲むことはできず、数字とコンマを含めることができます。これを行うのは非常に簡単です:
preg_replace(/[^\d,]/, '', $request->post('limit'))
...ただし、衛生状態はDBクラスレベルで行われないため、これは安全ではありません。
パラメータではないクエリ(列名、制限量など)への入力をサニタイズする適切な方法は何ですか?
クエリに入るがパラメータではないユーザー提供の入力を処理する100%安全な方法は1つだけです。受け入れたい入力をホワイトリストに登録します。
および同様の数値の場合LIMIT
、パラメータをにキャストするだけですint
。列名の場合、唯一の正しいことは、名前がデータベース内の列名の1つと完全に等しいことを確認することです。
ご覧のとおり、すべての異なるクエリ部分を「サニタイズ」する単一の方法はないため、質問全体が不適切に述べられています。それがポイントです。ほとんどの人 (PHP 拡張機能の作成者を含む) は、異なるクエリ部分には異なるフォーマットが必要であることを理解していません。
また、フォーマットはもう 1 つのキーワードです。「サニタイズ」がないため、実際にサニタイズするものは何もありませんが、SQL 構文で必要な非常に単純なルールはほとんどありません。すべてのインジェクションにもかかわらず必要ですが、構文規則としてだけです。それでも、すべてのクエリ部分が適切にフォーマットされている限り、副作用としてのインジェクションに対しても安全です
また、標準のプレースホルダーをいくつかの異なるタイプに拡張する必要があるという結論に達する人はほとんどいません。
したがって、私のクラスには現時点で 5 つあります。3 つはリテラル (文字列、整数、識別子) 用で、2 つは IN および SET 演算子に入る複雑なデータ セット用です。