0

重複の可能性:
orderbyおよびlimit句にpdoのプリペアドステートメントを使用するにはどうすればよいですか?

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はそれほど積極的に提案され、使用が推奨されているのですか?私は本当にこのような場合の消毒方法を書きたくありません、そして何も壊れたり妥協したりしないことを望みます。

4

2 に答える 2

2

あなたは整数値について心配しています。いつもの文字列と同様に、キャストまたは次の形式の$_GET整数に変換できます。%dsprintf

$query = $pdo->prepare(
    'SELECT * FROM log WHERE username=? LIMIT ' . (int) $_GET['page']
);

$query = $pdo->prepare(
    sprintf('SELECT * FROM log WHERE username=? LIMIT %d', $_GET['page'])
);

実際に文字列が必要な場合は、quote()すでに記述した関数が適切です。

于 2012-04-26T14:08:05.087 に答える
-3

これは素晴らしい初心者向けのチュートリアルです。自分を教育する。

PHPのPDOを使用する必要がある理由...

于 2012-04-26T14:09:46.320 に答える