PHPデータベース接続に関して推奨されている方法としてPDOを使用しています。しかし同時に、システムがハッカーから可能な限り安全であることを確認するために、クエリを保護することに夢中になっています。
PDOとプリペアドステートメントは最適な方法ですが、いくつか問題があります。クエリを手動で作成する必要があるカスタムフィルタリングシステムがあります。たとえば、これは次のとおりです。
$query=$pdo->prepare('SELECT * FROM log WHERE username=?');
$result=$query->execute(array($_GET['username']));
これは機能し、すべてが素晴らしいです-PDOは、$_GET変数がクエリに害を及ぼさないようにすることを扱います。
しかし、他のものから逃れる必要がある場合はどうすればよいですか?たとえば、このような状況で、5つのレコードだけを返したい場合:
$query=$pdo->prepare('SELECT * FROM log WHERE username=? LIMIT 5');
$result=$query->execute(array($_GET['username']));
これもまた機能します。しかし、制限値も$ _GETから取得された場合はどうなりますか?それを逃れる方法は?
これを行うには、最初にクエリを手動で作成し、次のようにPDO :: quote()メソッドを使用する必要があると考えました。
$query='SELECT * FROM log WHERE username=? LIMIT '.$pdo->quote($_GET['limit']);
しかし、クエリを壊すリミッターの周りに引用符を配置したため、これは機能しませんでした。
mysql_real_escape_string()が機能する方法をPDOでエスケープする適切な方法はありますか?後者は結果の変数を引用符で囲むことはありませんが、quote()でこの動作を停止することはできません。
別の方法は、独自のエスケープを作成することですが、そのようなものは、最初にPDOプリペアドステートメントを使用する目的を無効にします(プリペアドステートメント自体は常に値を引用符で囲みます)。
編集:私はまた、次のように、引用符で整数として値をキャストしようとしました:
$pdo->quote((int)$value,PDO::PARAM_INT);
しかし、それでも-それは-その周りに引用符を配置します。intval()と同じです。
その習慣のような原始的なことさえしなければならないのに、なぜPDOはそれほど積極的に提案され、使用が推奨されているのですか?私は本当にこのような場合の消毒方法を書きたくありません、そして何も壊れたり妥協したりしないことを望みます。