HttpClientFactory のログはデフォルトでヘッダー値を編集します
HttpClientFactory
のデフォルトのログには、すべてのリクエスト ヘッダーとレスポンス ヘッダーを出力する Trace
レベルのログが含まれます。 RedactLoggedHeaders メソッドを使用すると、これらのヘッダーのうちどれが機密であるかを指定できます。 これらのヘッダーの値はログに記録されません (ヘッダー名は残りますが、値は *
に置き換えられます)。 以前は、 RedactLoggedHeaders
でどのヘッダーも機密として指定されなかった場合、すべてのヘッダーは非機密と見なされ、すべての値がそのままログに記録されていました。 .NET 9 以降では、指定しない限り、すべてのヘッダーは機密情報と見なされ、すべての値が既定で編集されます。
以前の動作
以前は、 RedactLoggedHeaders が呼び出されなかった場合、すべてのヘッダーがそのままログに記録されていました。 RedactLoggedHeaders
が呼び出された場合、指定されたヘッダーは編集され、他のヘッダーはそのままログに記録されます。
services.AddHttpClient("default", ...); // 1
services.AddHttpClient("redacted-predicate", ...) // 2
.RedactLoggedHeaders(h => h.StartsWith("Auth") || h.StartsWith("X-"));
services.AddHttpClient("redacted-collection", ...) // 3
.RedactLoggedHeaders(new[] { "Authorization", "X-Sensitive", });
(1) デフォルト - 編集なし
trce: System.Net.Http.HttpClient.default.ClientHandler[102]
Request Headers:
Authorization: NTLM blob
X-Sensitive: some, secret, values
X-Other: some, other, values
Cache-Control: no-cache
(2) 述語で編集済み
trce: System.Net.Http.HttpClient.redacted-predicate.ClientHandler[102]
Request Headers:
Authorization: *
X-Sensitive: *
X-Other: *
Cache-Control: no-cache
(3) コレクションで編集済み
trce: System.Net.Http.HttpClient.redacted-collection.ClientHandler[102]
Request Headers:
Authorization: *
X-Sensitive: *
X-Other: some, other, values
Cache-Control: no-cache
新しい動作
.NET 9 以降では、 RedactLoggedHeaders が呼び出されない場合、すべてのヘッダーが編集されます。 RedactLoggedHeaders
が呼び出されると、指定されたヘッダーが編集されます。
services.AddHttpClient("default", ...); // 1 <--- CHANGED
services.AddHttpClient("redacted-predicate", ...) // 2 <--- remains the same
.RedactLoggedHeaders(h => h.StartsWith("Auth") || h.StartsWith("X-"));
services.AddHttpClient("redacted-collection", ...) // 3 <--- remains the same
.RedactLoggedHeaders(new[] { "Authorization", "X-Sensitive", });
(1) デフォルト - すべて編集済み
trce: System.Net.Http.HttpClient.default.ClientHandler[102]
Request Headers:
Authorization: *
X-Sensitive: *
X-Other: *
Cache-Control: *
導入されたバージョン
.NET 9 RC 1
破壊的変更の種類
この変更は、動作変更です。
変更理由
ヘッダーが機密情報として指定されていない場合、機密情報がログに公開される可能性があります。 この変更により、ログ記録がデフォルトで安全になります。
推奨される操作
ヘッダーをログに記録する場合は、どのヘッダーに機密情報が含まれている可能性があるかを評価し、 RedactLoggedHeaders
API を使用して明示的に指定します。 ConfigureHttpClientDefaults(IServiceCollection, Action<IHttpClientBuilder>) を使用して、クライアントごとにヘッダーを編集することも、すべてのクライアントに対してグローバルに編集することもできます。
「ブロック リスト」アプローチではなく、「許可リスト」アプローチの使用を検討してください。
ヘッダーに機密情報が含まれていないと確信している場合、または内部デバッグの目的で、 false
を返すデリゲートを渡すことによって、編集を完全に無効にすることができます。
private static readonly string[] SafeToLogHeaders = ....;
private static readonly string[] SuperSecretHeaders = ....;
// Specify for all clients.
services.ConfigureHttpClientDefaults(b =>
b.RedactLoggedHeaders(h =>
Array.IndexOf(SafeToLogHeaders, h) == -1)); // log values only for SafeToLogHeaders
// "globally" specified RedactLoggedHeaders can be overriden per-name.
// NOTE: RedactLoggedHeaders completely replaces the previously specified check.
services.AddHttpClient("override")
.RedactLoggedHeaders(SuperSecretHeaders); // log all values except SuperSecretHeaders
// -OR-
// (dangerous) Disable header value redaction for all clients.
services.ConfigureHttpClientDefaults(b => b.RedactLoggedHeaders(_ => false));
影響を受ける API
.NET