私は以下を持っています:
public class doCheck(){
public void performCheck(){
try {
perform all checks......
}
catch(Exception e){
logger.error("Exception occured in class doCheck in method performCheck");
thrown new MyNewException(e.getMessage());
}
}
}
クラスとメソッド名をログに記録しても安全ですか?
それはあなたのコードベースが隠されているかどうかに依存します。製品をクライアントに出荷する場合、クライアントはJavaバイトコードを簡単に検査できるため、クラス名をログに記録しても、ユーザーが入手できない情報は明らかになりません。
サーバー側のアプリケーションの場合も同様です。しかし、それはmayがそのようなログをクライアントに表示するためのセキュリティホールになります。これが、ほとんどのWebアプリケーションフレームワークが開発構成と本番構成を区別する理由です。開発中にエラーが発生した場合、デバッグ情報がユーザーに表示されます。本番環境では、この情報はサーバーに記録されますが、Webブラウザーやクライアントには表示されなくなります。
@Konradが直接的な質問に回答しましたが、例外処理には1つのマイナーな問題と2つの深刻な問題があります。あなたが最初にcodereview.SEに投稿したので、ここにそれらがあります:
では、4つ目の問題を追加します。例外が発生した場所をログに記録しますが、例外が発生したときに何をしていたか、またはコンテキスト情報を提供しません。実際の例外をログに記録すると(ポイント#1)、どこで発生したかがわかります。さらに重要なのは、「ファイルfoo.txtを開けません」のようなことです。
これは特に安全ではないので、このクラスで非表示にしたい重要なものがない限り、またはクラスがクリティカルパスの一部である場合(安全なハンドシェイクや「非表示」機能など)は、これを問題とは見なしません。まったく。
さらに、ここではJavaここで話します。クライアントでJavaを実行しているクライアント側のアプリについて話している場合、彼らはいつでも変更できます自分のJREを使用して独自のデバッグルーチンを追加したり、カスタムクラスローダーを使用したり、クラスに好きな方法でアクセスしたりすることができます。が、統計的にありそうもない悪意のあるユーザーによって引き起こされる損失に対してこれを達成するために必要な時間と労力を考慮すると、通常は費用効果が高くありません。
ログをクライアントに(たとえば、ユーザーのブラウザーに)出力する可能性があるサーバー側のソフトウェアについて話している場合、それはおそらくそれほど大きな問題ではありませんが、修正するのはすでに簡単です:コンテナーの構成それに応じて、代わりにロギングフレームワークまたはマルチプレクサを使用して、デバッグ目的でサーバー上の適切なファイルに出力します。このようにして、デバッグに役立つレコードを保持しますが、潜在的に役立つ情報を損なうことはありません。
しかし、一般的には、これはおそらく問題にはなりません。開発者が作業内容を出力することが多いため、デバッグメッセージに入力する内容が問題になる可能性があります(ユーザー名、パスワード、ソルト、セキュリティトークンのデバッグ出力を明確に表示したくない場合) )。