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