1

複雑なユーザー指定の WHERE 句があり、PDO と MySQL を使用するシナリオのベスト プラクティスは何ですか?

ユーザーは、クエリを実行するテーブルの 1 つ以上の列に対して 1 つ以上の選択基準を指定できる必要があります。PHP の末尾にある case ステートメントで予測するには、可能な組み合わせが多すぎます。一方、条件を直接入力できるようにすると、パラメーター化されたクエリが SQL インジェクション攻撃に対して提供するはずの保護が無効になります。

私はこの男がしたことを正確にやろうとしています:

複数のWHERE句を使用してMySQLクエリを実行するにはどうすればよいですか?

...ただし、私は良い小さな codemonkey になり、php_mysql の代わりに PDO を使用し、文字列のサニタイズに依存しないようにしています。

ああ、もう 1 つ:

[column, operator, value]ユーザーが指定した各基準を配列として渡すことができると思います(例: [ "age", ">", "30" ])。その配列の最初の 2 つの要素がそれぞれ有効な列名と演算子名と正確に一致することを確認し、最後の要素を強制的に数値にしてから、PHP スクリプトの WHERE 句を含む文字列に追加することができました。しかし、次のような基準は["fullname","like","M_rty M%cFly"]どうでしょうか? さて、ユーザー作成文字列のサニタイズに戻りましたね。

4

1 に答える 1

2

しかし、次のような基準は["fullname","like","M_rty M%cFly"]どうでしょうか?

列名と演算子 (を含むLIKE) については、ホワイトリストを使用して検証します。ユーザー入力が既知の有効な選択肢と一致しない場合は、その入力を使用しないでください。

"M_rty M%cFly" などのリテラル文字列値には、クエリ パラメーターを使用します。数値リテラルまたは日付リテラルについても同じです。クエリ パラメーターは、SQL 式でリテラル値として扱う必要がある動的コンテンツに最適です。

値にはクエリ パラメータを使用し、その他の場合にはホワイトリストを使用します。

于 2012-12-13T23:25:09.800 に答える