我们在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。
答案 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>
注意:在这种情况下,我已将模块定义为应用程序的App_Start文件夹中的类。
{{1}}
答案 1 :(得分:0)
听我在asp.net 1.0或2.0中也有一个遗留站点。我们确实将其框架更改为4.0。
所以,我的建议是改变它的框架并运行冒烟测试,然后可能会出现一些问题然后按预期解决,然后主要关注处理像Response.Write这样的事情。由于ASP.net现在是开源的,因此获取这些代码并对核心功能进行最小的更改并完成工作,尝试尽可能多地利用部分功能,或任何类似的事情,以便在不丢失更改的情况下进行升级。 / p>