diff --git a/backend/src/TeleWave.Api/Program.cs b/backend/src/TeleWave.Api/Program.cs index 9c2e90a..8a61b26 100644 --- a/backend/src/TeleWave.Api/Program.cs +++ b/backend/src/TeleWave.Api/Program.cs @@ -38,26 +38,35 @@ builder.Services.Configure(options => { options.ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto; - foreach ( - var proxy in builder - .Configuration.GetSection("ForwardedHeaders:KnownProxies") - .Get() - ?? [] - ) + foreach (var proxy in ReadList(builder.Configuration, "ForwardedHeaders:KnownProxies")) options.KnownProxies.Add(IPAddress.Parse(proxy)); - foreach ( - var network in builder - .Configuration.GetSection("ForwardedHeaders:KnownNetworks") - .Get() - ?? [] - ) + foreach (var network in ReadList(builder.Configuration, "ForwardedHeaders:KnownNetworks")) { var parts = network.Split('/'); options.KnownIPNetworks.Add( new System.Net.IPNetwork(IPAddress.Parse(parts[0]), int.Parse(parts[1])) ); } + + // Список доверенных прокси/сетей приходит из .env одной строкой (env-переменная по одному ключу + // в string[] не биндится) — принимаем и запятые, и массив appsettings/индексы __0. Иначе + // задокументированная в .env.example запись через запятую молча игнорировалась бы, оставляя + // доверие только loopback и обрывая подхват X-Forwarded-Proto. + static string[] ReadList(IConfiguration config, string key) + { + var array = config.GetSection(key).Get(); + if (array is { Length: > 0 }) + return array; + + var scalar = config[key]; + return string.IsNullOrWhiteSpace(scalar) + ? [] + : scalar.Split( + ',', + StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries + ); + } }); builder.Services.AddHttpContextAccessor();