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错误。非常感谢你的发帖,虽然我相信它会帮助别人。