intertubes のチュートリアルから、PDO クエリの実行について少し学びました。チュートリアルでは try/catch を使用し、クエリは基本的に次のように構成されています。
try {
$dbh = new PDO("mysql:host=$hostname;dbname=$dbname", $user, $pass);
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
$stmt = $dbh->prepare("UPDATE users yada yada yadda");
$stmt->bindParam(':param1', $param1, PDO::PARAM_INT);
$stmt->bindParam(':param2', $param2, PDO::PARAM_INT);
$stmt->execute();
}
catch(PDOException $e)
{
echo $e->getMessage();
}
もちろん、これは mysql エラーを画面に表示します。悪いクエリを実行するつもりはありませんが、攻撃者がそのエラーを誘発してそこから何かを学ぼうとした場合にどうなるかを考えながら、エラーを画面に表示するという考えは好きではありません。
代わりにエラーがログファイルに送られるようにするためのより良い方法はありますか、それとも、バインドされたパラメーターによりSQLインジェクションのリスクが排除されるため、実際にはこの点で恐れることはありませんか?