gpt4 book ai didi

c# - 处理 veracode 引发的跨站点脚本漏洞

转载 作者:太空狗 更新时间:2023-10-29 21:56:39 24 4
gpt4 key购买 nike

我们在 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。

最佳答案

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


模块示例

本例使用request.Header的Content-Type的值来判断是否应用html编码。

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();
}
}
}

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

Stream 是一个抽象类,所以它会生成所有相关的覆盖方法 stub 。

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);
}
}

将模块添加到 Web.Config

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

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

关于c# - 处理 veracode 引发的跨站点脚本漏洞,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40679474/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com