プリペアド ステートメントが SQL インジェクションに対する保護を求める究極の方法であることは理解しています。ただし、それらは限られた方法でカバレッジを提供します。たとえば、操作ごとの順序をユーザーに決定させた場合 (つまり、ASC か DESC かなど)、準備されたステートメントについては説明しません。
ユーザー入力を事前定義されたホワイトリストにマッピングできることを理解しています。ただし、これは事前にホワイトリストを作成または完全に推測できる場合にのみ可能です。
たとえば、上記のケース ( ASC または DESC ) では、これを簡単にマップして、受け入れられた値のリストに対して検証することができます。しかし、SQL ステートメントの一部がホワイト リストに対して検証できない状況はありませんか?
そのような状況が存在する場合、推奨されるアプローチは何ですか?
基礎となるデータベースの組み込みのエスケープ ユーティリティ (mysql の mysqlL_real_escape_string など) を使用して user_input を全面的にエスケープするとしたら、どこで失敗しますか?
私は常に引用符で囲まれた値を使用してSQLステートメントを作成するという前提でこの質問をしています-整数であっても...
次の例を見て、それについて考えてみましょう..
select {$fields} from {$table} where Age='{$age}' order by {$orderby_pref}
すべての変数がユーザーによって提供されると仮定します。
上記の SQL のすべての変数を mysql_real_escape_string にする場合 (半分だけをカバーする準備済みステートメントを使用して、残りの半分のホワイトリストを作成することを強制するのとは対照的に)、それは同様に安全ではないでしょうか (コーディングしやすい)?そうでない場合、どの入力シナリオでエスケープ ユーティリティが失敗しますか?
$fields = mysql_escape($fields);
$table = mysql_escape($table);
$age = mysql_escape($age);
$orderby_pref = mysql_escape($orderby_pref);
select {$fields} from {$table} where Age='{$age}' order by {$orderby_pref}