当前位置: 首页 > 知识库问答 >
问题:

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

麹凯捷
2023-03-14

我们在ASP中有一个遗留的web应用程序。Net和C#,我们得到了大约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));

如果我删除了Http实用程序。HTMLEncode行Veracode对此抱怨。由于我们在很多地方都在进行此字符串操作,因此在任何地方实现此操作是不可行的。是否有可能在一个地方实现此编码,并且所有响应和请求都应该通过该管道,例如HTTPHandler和HTTPModule。

共有2个答案

公良运锋
2023-03-14

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

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

应涵容
2023-03-14

您可以通过有条件地分配给HttpResponse的自定义HttpModule来实现这一点。过滤以拦截和处理HttpResponse。写下用法。

本例使用请求的内容类型的值。标头以确定是否应应用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是一个抽象类,因此它将生成所有相关的重写方法存根。

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

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

<system.webServer>
    <modules>
        <add name="FilterResponseWriteModule" type="HttpModulesTestApp.App_Start.FilterResponseWriteModule"/>
    </modules>
</system.webServer>
 类似资料:
  • 有人能解释为什么VeraCode认为使用作为公共属性是一个坏主意,并提出一个很好的缓解意见吗? 代码(JavaScript): 攻击矢量:名称 描述: ,对name()的调用包含跨站点脚本(XSS)漏洞。该应用程序使用不受信任的输入填充HTTP响应,从而允许攻击者嵌入恶意内容(如Javascript代码),这些内容将在受害者浏览器的上下文中执行。XSS漏洞通常被用来窃取或操纵cookie、修改内容

  • 只要应用程序获取不受信任的数据并将其发送到客户端(浏览器)而未经验证,就会发生跨站点脚本(XSS)。这允许攻击者在受害者的浏览器中执行恶意脚本,这可能导致用户会话劫持,破坏网站或将用户重定向到恶意站点。 下面我们借助一个简单图表了解这个漏洞的威胁代理,攻击向量,安全弱点,技术影响和业务影响。 威胁代理 - 内部/外部用户或管理员发送给系统的不受信任的数据。 攻击者的方法 - 发送不受信任的数据/基

  • 类别 存储型 XSS 攻击 反射型 XSS 攻击 基于 DOM 的 XSS 攻击

  • 问题内容: 是否可以在CSS样式表中使用跨站点脚本?例如,参考样式表包含恶意代码,您将如何处理?我知道您可以使用样式标签,但是样式表呢? 问题答案: 来自浏览器安全手册 JavaScript执行的风险。作为一个鲜为人知的功能,某些CSS实现允许将JavaScript代码嵌入样式表中。至少有三种方法可以实现此目标:使用expression(…)指令,该指令可以评估任意JavaScript语句并将其值

  • 现在的网站包含大量的动态内容以提高用户体验,比过去要复杂得多。所谓动态内容,就是根据用户环境和需要,Web应用程序能够输出相应的内容。动态站点会受到一种名为“跨站脚本攻击”(Cross Site Scripting, 安全专家们通常将其缩写成 XSS)的威胁,而静态站点则完全不受其影响。 攻击者通常会在有漏洞的程序中插入JavaScript、VBScript、 ActiveX或Flash以欺骗用户