Основные статические файлы ядра Dotnet Идиосинкразия - PullRequest
0 голосов
/ 29 октября 2018

Итак, у меня есть этот код в моем 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 для предварительного теста моей системы, и в результате этой проблемы я получаю предупреждение о средней безопасности просмотра каталогов. Является ли это фактической дырой в безопасности, я не знаю достаточно, чтобы сказать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...