Итак, у меня есть этот код в моем Startup.cs
app.UseStaticFiles(new StaticFileOptions()
{
FileProvider = new PhysicalFileProvider(Path.Combine(env.WebRootPath, @"dist")),
RequestPath = new PathString("/dist"),
ServeUnknownFileTypes = false,
OnPrepareResponse = s =>
{
s.Context.Response.Headers.TryAdd("X-Content-Type-Options", "nosniff");
Console.WriteLine("\n[Webpack Static Files Middleware] We made it here!!\n");
foreach (var v in s.Context.Request.Query)
{
// For each query, check for illigal characters that could give access to the file system
if (v.Value.ToString().Contains('/') || v.Value.ToString().Contains('\\'))
{
// If found return forbidden and overwrite the response body
s.Context.Response.StatusCode = 403;
s.Context.Response.Body = null;
}
}
}
});
app.Use(async (context, next) =>
{
Console.WriteLine("\nApp.Use started\n");
var path = context.Request.Path.Value;
if (path.LastIndexOf('/') == path.Length - 1)
{
Console.WriteLine("Directory browsing is disabled. Last character is a /");
context.Response.StatusCode = 403;
context.Response.Body = null;
return;
}
context.Response.Headers[HeaderNames.Vary] = new string[] { "Accept-Encoding" };
context.Response.Headers.Add("X-XSS-Protection", "1; mode=block");
context.Response.Headers.Add("Strict-Transport-Security", "max-age=157680000; includeSubDomains; preload");
context.Response.Headers.Add("X-Frame-Options", "DENY");
context.Response.Headers.Add("Cache-Control", "no-cache, no-store, must-revalidate;");
context.Response.Headers.Add("Pragma", "no-cache");
await next();
});
Цель состоит в том, чтобы обслуживать только папки SPA .js, .css и изображения в папке ресурсов.
Работает так, как задумано, за исключением одной крошечной странности.
Если я еду в
https://localhost:[myport]/dist/main.js
Работает как задумано.
Когда я иду к:
https://localhost:[myport]/dist/main.js/
Он полностью обходит все мое промежуточное ПО, но все еще обслуживает файл.
Я не получаю никакого запуска Console.WriteLine (), и все заголовки, которые я добавляю в App.Use (), также отсутствуют.
Что вызывает это? Это происходит только тогда, когда существует файл, по которому я иду. Если я попытаюсь загрузить несуществующий путь к файлу, он не повторяет эту проблему, пути, подобные этому, попадут в мое промежуточное ПО:
https://localhost:[myport]/dist/thisfiledoesntexist.js/
https://localhost:[myport]/dist/assets/
Я использую OWASP Zap для предварительного теста моей системы, и в результате этой проблемы я получаю предупреждение о средней безопасности просмотра каталогов. Является ли это фактической дырой в безопасности, я не знаю достаточно, чтобы сказать.