3

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インジェクションのリスクが排除されるため、実際にはこの点で恐れることはありませんか?

4

3 に答える 3

4

try..catch ブロックを使用して、エラーを引き起こす可能性のあるコードをキャッチし、ロードしているものをダウンさせるという点で、チュートリアルは正しいです。したがって、このコードの実行に依存するコードがある場合は、それを try セクションに含めます。作成しているものが機能するために必ずこのコードを実行する必要がある場合は、おそらくエラーをキャッチして、ユーザーを何らかのエラー ページにリダイレクトする必要があります。

phpエラーログ機能を使用する場合は、代わりに

echo $e->getMessage();

使用できます

error_log($e->getMessage(),0);

PDO からのエラー メッセージを php エラー ログに直接送信します。エラー ログの場所がわからない場合は、*nix システムを実行している場合は、このリンクをチェックして、エラー ログへのいくつかのポインターを確認できます。Windows を実行している場合は、設定ファイルがどこかにあるはずです。または、ログを確実に見つける方法として、php ini ファイルを参照して、それが指している場所を確認することもできます。

于 2013-05-07T15:52:01.020 に答える
1

これを行うより良い方法はありますか

はい、もちろん!

このチュートリアルで教えた PDO エラーの処理方法は明らかに間違っています。
したがって、これらのtry..catchコマンドを削除してください - それだけです。

このようにして、他の PHP エラーと同じように PDO 例外を処理することができます。したがって、クエリ エラーが発生した場合、スクリプトは停止し、エラーがログに記録されます (PHP にそのように指示した場合)。
PHP にエラーを表示しないようにするには、ini ディレクティブを に設定log_errorsする必要があります。1display_errors0

于 2013-05-07T15:28:26.627 に答える