8

信号が混在しています。PDOドキュメントの警告は、try-catchを省略するとセキュリティが危険にさらされる可能性があることを明確に示しています。ただし、このスレッドは、実際には必要ないことを示しています。私の意見では、すべてのクエリをtry-catchでラップするのはかなり面倒です。これを処理する方法について何かアドバイスはありますか?

4

3 に答える 3

10

セキュリティ上のリスクがありますが、どこにでもtry/catchを追加する必要はありません。例外をキャッチしないと、例外からのエラーメッセージ(機密情報が含まれている可能性があります)がユーザーに表示される可能性があるというリスクがあります。

ただし、ドキュメントに記載されているように、代わりに例外ハンドラを追加できます。一般的なエラーメッセージにリダイレクトすることで、エラーメッセージからユーザーに機密情報を表示することを回避できます。

一般的なエラーハンドラを設定することは、どのような場合でも非常に賢明なことのように思えます。ユーザーに不可解なエラーメッセージを表示したくありません。「すべてを試す/キャッチする」アプローチを採用したとしても、発生する可能性のあるすべての例外を確実にキャッチすることは難しいため、例外ハンドラーをフォールバックとして使用する必要があります。

于 2012-06-30T05:33:44.310 に答える
3

PDOには、3つの構成可能なエラーモードがあります。デフォルトでは、例外をスローするのではなく、エラーコードを設定するだけです。

ただし、を使用する必要がありPDO::ERRMODE_EXCEPTIONます。PHPとPDOが通常エラーを処理する方法(つまり、コードを黙って押して、あなたに言わずに間違ったことをする)は、絶対にクレイジーであり、PHPの恐ろしさの大きな理由です。

クエリで問題が発生した場合は、実行を停止して例外をスローすることで、明確なトレースバックを取得し、問題を見つけて修正できます。

さらに、すべてのクエリerrorCodeの後にチェックするよりも、try-catchを使用する方がはるかに簡単です(つまり、「煩わしさ」が少なくなります) 。エラーの可能性が予想され、それに対して何かできるerrorInfo場合にのみ、try-catchを使用する必要があります。それ以外の場合は、例外をバブルアップさせる必要があります。予期しないエラーである場合は、コードのバグが原因である可能性があります。修正できるように、例外を介してそのことを知っておく必要があります。

例外の報告で特別なことをしたい場合(たとえば、きれいに印刷したり、電子メールを送信したりするなど)、デフォルトの例外ハンドラーを登録して、キャッチされなかった例外を処理します。本番システムでは、一般的な500ページを表示し、エラーの詳細を軽視するデフォルトの例外ハンドラーを登録し、デバッグのために完全なトレースバックを別の場所に記録する必要があります。

于 2012-06-30T05:42:06.493 に答える
1

エラー発生する可能性がある場合は、最終的には発生します。実行している環境に関係なく、PDOクエリが生成する可能性のある潜在的なエラーを処理する必要があります。(あなたが投稿したスレッドの人たちがしたように)これは本番システムなので、try..catchは必要ないという仮定を立てることは愚かです、私見。エラーは、コードのデバッグ中にスローされるだけでなく、本番システムでも発生する可能性があります。個人的には、ログに表示されるエラーのコンテキストを把握するのが好きなので、実際にはクエリの周りでtry..catchを使用します。

これは、最終的にユーザーに表示されるエラーとは何の関係もありません。セキュリティという言葉を使用すると、この文脈では物事が曖昧になることがわかりました。エラーの処理方法に関係なく、システムはユーザーに不可解なエラーメッセージ(機密データが含まれる可能性があります)を表示しないようにする必要があります(これはPDO固有ではありません)。

これを処理する方法はいくつかあります。

  1. すべてがすでにバインドされているプリペアドステートメントを渡すことにより、PDOクエリを実行する関数を作成します。
  2. グローバル例外ハンドラーを作成し、そこで例外をキャッチします(コンテキストが失われるため、このアプローチは好きではありません...これがグローバルハンドラーでキャッチされた場合、ユーザーにどのようなエラーを表示しますか?グローバルコンテキストでキャッチされた場合はエラーになりますか?)
  3. PDOを初期化して、例外をスローしないようにし、それがあなたの毒である場合は、手動のエラーチェックを実行します。個人的には、例外はOOPベースのシステムとうまく調和していると思いますが、それぞれが独自のものです。

私の2c。

于 2012-06-30T05:44:37.500 に答える