C# &引用;不适当的资源关闭或释放“;Veracode出错,为什么?
这个代码有什么问题?此外,我如何修复它C# &引用;不适当的资源关闭或释放“;Veracode出错,为什么?,c#,.net-core,veracode,C#,.net Core,Veracode,这个代码有什么问题?此外,我如何修复它 public class BodyStreamMiddleware { private readonly RequestDelegate _next; public BodyStreamMiddleware(RequestDelegate next) { _next = next; } public async Task Invoke(HttpContext context) { // Replace
public class BodyStreamMiddleware
{
private readonly RequestDelegate _next;
public BodyStreamMiddleware(RequestDelegate next) { _next = next; }
public async Task Invoke(HttpContext context)
{
// Replace the FrameRequestStream with a MemoryStream.
// This is because the MemoryStream is rewindable, the FrameRequestStream is not.
// This allows ExceptionFilters to read the body for logging purposes
string bodyAsText;
using (var bodyReader = new StreamReader(context.Request.Body))
{
bodyAsText = bodyReader.ReadToEnd();
}
var bytesToWrite = Encoding.UTF8.GetBytes(bodyAsText);
using (var memoryStream = new MemoryStream())
{
memoryStream.Write(bytesToWrite, 0, bytesToWrite.Length);
memoryStream.Seek(0, SeekOrigin.Begin);
context.Request.Body = memoryStream;
// Tell ASP.NET core to dispose the memory stream when the request ends
// (only added in desperation)
context.Response.RegisterForDispose(memoryStream);
await _next.Invoke(context);
}
}
}
当我在上面运行Veracode扫描时,它会给我
不正确的资源关闭或释放
我知道下游进程可以获取对内存流的引用并将其挂起,但看不出这与默认的asp.net行为有什么不同(即某些东西可能会抓住FrameRequestStream)。为了他人的利益回答我自己的问题 通过以不同的方式重新读取请求流,我成功地解决了这个问题。这让Veracode感到高兴,尽管我根本不相信前面的代码有任何错误 把这个贴在你的创业课上
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
...
app.Use(async (context, next) => {
context.Request.EnableRewind();
await next();
}
...
});
我在这里写过博客,因为我们都被告知要写博客,因为如果我们这样做,我们将成为下一个Scott Hanselman,提高我们的费率并放弃每天的通勤,对吗?这是Veracode内部的一个问题。每当您在using块中使用异步操作时,就会出现问题 在下面的示例中,DoWork很好。DoWorkAsync被标记为不正确的发布
public static byte[] DoWork()
{
var buffer = new byte[10];
using (var stream = new MemoryStream())
{
for (int i = 0; i < 10; i++)
{
stream.Write(buffer, i, 1);
}
return stream.ToArray();
}
}
public static async Task<byte[]> DoWorkAsync()
{
var buffer = new byte[10];
using (var stream = new MemoryStream())
{
for (int i = 0; i < 10; i++)
{
await stream.WriteAsync(buffer, i, 1);
}
return stream.ToArray();
}
}
公共静态字节[]DoWork()
{
var buffer=新字节[10];
使用(var stream=new MemoryStream())
{
对于(int i=0;i<10;i++)
{
流写入(缓冲区,i,1);
}
返回流ToArray();
}
}
公共静态异步任务DoWorkAsync()
{
var buffer=新字节[10];
使用(var stream=new MemoryStream())
{
对于(int i=0;i<10;i++)
{
wait stream.WriteAsync(缓冲区,i,1);
}
返回流ToArray();
}
}
此外,每次扫描似乎只识别一次此问题。当您试图弄清楚为什么一个using
块被标记而其他块没有被标记时,这会导致更多的混淆。您可以通过注释掉标记的块并再次运行扫描来证明这一点,并看到它现在使用块在不同的上标记相同的问题
如果您环顾堆栈溢出,就会发现Veracode在异步C#时经常产生误报。我建议您尽可能将其标记为“缓解为假阳性”或“通过设计缓解”,并且不要为了错误扫描而更改完全有效的代码。对于注册表项和使用块来处理,这两种方法都很奇怪?再次强调,IDisposable.Dispose
应该是幂等的。如果调用RegisterForDispose
-为什么还要手动处理流?。。。试图让Veracode快乐的绝望。以前它只是使用
的。我会编辑这个问题。你有没有找到解决办法?我在一个非常类似的场景中抛出了相同的代码。@VinnyGuitara我确实找到了一个解决方案,通过以不同的方式使请求流可倒带。我会尝试在早上为您挖掘代码,并发布和回答,因为它可能对其他人有用。感谢这个NeedHack,尽管这不是我想要的。我的代码中的MemoryStream似乎导致了这个CWE 404错误。非常感谢你的发帖,虽然我相信它会帮助别人。