Dotnet核心静态文件中间件特质

时间:2018-10-29 18:34:48

标签: asp.net-core single-page-application middleware static-files

所以我的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对系统进行初步笔测试,并且由于此问题,我收到“目录浏览中安全性”警告。我不知道这是否是一个实际的安全漏洞。

0 个答案:

没有答案