处理由veracode引发的跨站点脚本缺陷

时间:2016-11-18 14:26:46

标签: c# asp.net veracode

我们在ASP.Net和C#中有一个遗留的Web应用程序,我们得到了大约400个以及Veracode扫描引发的跨站点脚本漏洞。 我已经创建了一个示例Web应用程序并模拟了该问题,并发现每当我们使用任何字符串输入时,它就会提高它的缺陷。 做HttpUtility.HtmlEncode(TextBox1.Text);"满足veracode,但是在所有400个地方都应用这种改变是不可行的,因为那时会有大量的工作和测试工作。 我正在寻找在httphandler中实现一些插件,以便所有输入都在一个地方编码,我们无需在任何地方进行更改。 有人可以引导我,如果这是可能的,如果是,即使你可以指导我只是接近将足够好,至少有一个方向。 非常感谢提前。

StringOps strop = new StringOps();
        string txt1, txt2;
        txt1 = HttpUtility.HtmlEncode(TextBox1.Text);
        txt2 = HttpUtility.HtmlEncode(TextBox2.Text);
        Response.Write(strop.Add(txt1, txt2));

如果我删除了HttpUtility.HTMLEncode行,Veracode会抱怨它。由于我们正在进行这种字符串操作的地方很多,因此无处不在。是否可以在单个地点实施此编码,并且所有响应和请求都应通过该管道,例如HTTPHandler和HTTPModule。

2 个答案:

答案 0 :(得分:1)

您可以使用自定义HttpModule来完成此操作,该自定义HttpResponse.Filter会有条件地分配给HttpResponse.Write来拦截和处理Content-Type用法。

模块示例

此示例使用request.Header的public class FilterResponseWriteModule : IHttpModule, IDisposable { private System.IO.Stream filterStream; public FilterResponseWriteModule() { } public void Init(HttpApplication context) { context.BeginRequest += Context_BeginRequest; } private void Context_BeginRequest(object sender, EventArgs e) { var context = (sender as HttpApplication).Context; if (ShouldApplyFilter(context.Request)) ApplyFilter(context.Response); } private bool ShouldApplyFilter(HttpRequest request) { return string.Equals(request.ContentType, @"text/plain", StringComparison.OrdinalIgnoreCase); } private void ApplyFilter(HttpResponse response) { filterStream = new EncodeStreamFilter(response.Filter); response.Filter = filterStream; } public void Dispose() { if (filterStream != null) { filterStream.Dispose(); } } } 值来确定是否应该应用html编码。

public class EncodeStreamFilter : Stream, IDisposable
{
    private Stream _baseStream;

    public EncodeStreamFilter(Stream responseFilter)
    {
        _baseStream = responseFilter;            
    }

    public override void Write(byte[] buffer, int offset, int count)
    {
        byte[] bufferBlock = new byte[count];
        Buffer.BlockCopy(buffer, offset, bufferBlock, 0, count);

        var encodedBytes = Encoding.UTF8.GetBytes(HttpUtility.HtmlEncode(Encoding.UTF8.GetString(bufferBlock)));

        _baseStream.Write(encodedBytes, 0, encodedBytes.Length);
    }

    public override bool CanRead
    {
        get
        {
            return _baseStream.CanRead;
        }
    }

    public override bool CanSeek
    {
        get
        {
            return _baseStream.CanSeek;
        }
    }

    public override bool CanWrite
    {
        get
        {
            return _baseStream.CanWrite;
        }
    }

    public override long Length
    {
        get
        {
            return _baseStream.Length;
        }
    }

    public override long Position
    {
        get
        {
            return _baseStream.Position;
        }

        set
        {
            _baseStream.Position = value;
        }
    }

    public override void Flush()
    {
        _baseStream.Flush();
    }

    public override int Read(byte[] buffer, int offset, int count)
    {
        return _baseStream.Read(buffer, offset, count);
    }

    public override long Seek(long offset, SeekOrigin origin)
    {
        return _baseStream.Seek(offset, origin);
    }

    public override void SetLength(long value)
    {
        _baseStream.SetLength(value);
    }



    protected override void Dispose(bool disposing)
    {
        if (!disposing)
        {
            _baseStream.Dispose();
        }
        base.Dispose(disposing);
    }
}

过滤器流示例(封装和覆盖)

Stream是一个抽象类,因此它将生成所有相关的覆盖方法存根。

<system.webServer>
    <modules>
        <add name="FilterResponseWriteModule" type="HttpModulesTestApp.App_Start.FilterResponseWriteModule"/>
    </modules>
</system.webServer>

将模块添加到Web.Config

注意:在这种情况下,我已将模块定义为应用程序的App_Start文件夹中的类。

{{1}}

答案 1 :(得分:0)

听我在asp.net 1.0或2.0中也有一个遗留站点。我们确实将其框架更改为4.0。

所以,我的建议是改变它的框架并运行冒烟测试,然后可能会出现一些问题然后按预期解决,然后主要关注处理像Response.Write这样的事情。由于ASP.net现在是开源的,因此获取这些代码并对核心功能进行最小的更改并完成工作,尝试尽可能多地利用部分功能,或任何类似的事情,以便在不丢失更改的情况下进行升级。 / p>