説明
例外メッセージ、スタックトレース、SQLエラー、内部パスなどをユーザーへそのまま返すと、システム構造や攻撃に利用できる入力箇所を推測されるおそれがあります。本番環境では一般的なエラーを返し、詳細はサーバーログに記録してください。
想定される影響
- 内部パス、クラス名、クエリ構造の露出
- 脆弱性の探索や攻撃の自動化への利用
- 例外メッセージに含まれる機密データの漏えい
対処方法
- ユーザーには一般的なエラーメッセージを返してください。
- 例外の詳細は、アクセス制御されたサーバーログへ記録してください。
- 本番環境では、フレームワークのデバッグ用エラーページや詳細なエラー応答を無効にしてください。
例
変更前
java
catch (Exception e) {
response.getWriter().write(e.getMessage());
}
変更後
java
catch (Exception e) {
logger.warn("request failed", e);
response.sendError(500, "Internal server error");
}
解説:
- 変更前:
getMessageやgetLocalizedMessageの結果をHTTP本文やエラー応答に含めると、内部パス、SQLエラー、設定値、ライブラリの動作に関する情報が漏れるおそれがあります。 - 変更後: 例外の詳細はサーバーログにのみ記録し、クライアントには一般的なエラーメッセージを返します。