扩展/覆盖现有的ASP.NET控件

5

我有一个项目,里面有许多标签、文本框和其他Web控件。它们实际上有数百个。

现在我想能够覆盖某些属性,以便通过反跨站脚本库运行内容。例如,当我使用来自数据库的数据设置标签的文本属性时,我希望自动运行一个函数,以清除任何潜在的恶意代码。

我还尝试使用实现IExtenderProvider接口的类覆盖文本属性,但是没有得到帮助。

如果我从头开始构建这个项目,我可能会选择创建一个继承系统标签类的新标签类。由于项目规模较大,我不想这样做。

有什么想法吗?


创建自己的 CustomControl: Control 并且覆盖 Render() 等方法。 - Murali Murugesan
但这需要我手动用自定义控件替换所有现有的控件,对吗?这正是我想避免的。 - christok
你能修改现有的控件吗?听起来它们在你的项目中,所以你可能只需要将反跨站脚本代码添加到属性的get/set部分。 - charlesw
我认为你最好先清理数据,然后确保它不会再次变脏。 - John Saunders
2个回答

1
首先,我要指出避免XSS漏洞的正确方法是在将用户输入嵌入页面之前对其进行适当的编码。例如,如果您将纯文本字符串分配给Label的Text属性,则需要对该值进行编码,因为Text属性按原样呈现为HTML:
label.Text = HttpUtility.HtmlEncode(user.Name)

(注意:所谓“纯文本”,是指像<和&这样的字符没有任何特殊含义的文本。)

其次,作为一项额外的深度防御措施,您应在收集用户输入时验证其内容。但输入验证并 不会 消除对用户输入进行正确编码的需求(因为某些内容可能会漏过验证)。始终对用户输入进行编码!

好的,我们假设您将在时间和测试允许的情况下进行验证,但您现在需要一个快速解决方案。您可以创建控件适配器,以更改特定类型的控件的呈现方式。以下是一个示例,它将给您应用程序中的每个单独的<asp:Label>添加一些星号:

Imports System.Web.UI
Imports System.Web.UI.WebControls.Adapters

Public Class LabelControlAdapter
    Inherits WebControlAdapter

    Protected Overrides Sub RenderContents(writer As HtmlTextWriter)
        Dim label As Label = Me.Control
        label.Text = "***" + label.Text + "***"  ' TODO: Use your anti-XSS library
        MyBase.RenderContents(writer)
    End Sub
End Class

你可以为其他类型的控件创建额外的控件适配器,或修改LabelControlAdapter以嗅探Me.Control的类型并执行不同的操作。
你还需要在站点的App_Browsers文件夹中添加一个.browser文件,列出您正在适配的每个控件类型:
<browsers>
    <browser refID="Default">
        <controlAdapters>
            <adapter
                controlType="System.Web.UI.WebControls.Label"
                adapterType="TempVBWebApp.LabelControlAdapter, TempVBWebApp" />
        </controlAdapters>
    </browser>
</browsers>

我曾经认为,除非基类函数被标记为可重写,否则不能使用“Overrides”。我最初在VS中尝试使用覆盖,但它给了我一个错误,这就是我使用阴影的原因。 - charlesw
我会尝试一下Michael,谢谢。此外,我感谢您关于反XSS的所有建议。我可能不应该提到它,因为这是一个与主题无关的话题,但既然已经提到了:必须从数据库中获取需要进行清理的标记,并且即使它一开始就很干净,Veracode也要求我们通过反XSS库运行它,以便将应用程序标记为安全。我正在努力寻找一种方法,以尽可能少的痛苦让他们满意! :) - christok
哇,这个直接套用就有效了——正是我在寻找的。现在我们要看看它是否能帮助我们通过代码扫描。非常感谢! - christok

0

我假设由于某种原因,您无法修改现有控件的代码,否则您可以将反XSS代码添加到它们中。

在这种情况下,您可以使用VB.Net的阴影能力:http://msdn.microsoft.com/en-us/library/1h3wytf6.aspx

以下是您可能如何实现它的示例:

Module Module1

    Sub Main()

    End Sub

    'Placeholder for antiXSS library functions 
    Public Function antiXSS(ByVal input As String) As String
        Return input
    End Function

    'Original control class 
    Public Class originalControlClass
        Private _name As String
        Public Property name As String
            Get
                Return _name

            End Get
            Set(value As String)
                _name = value
            End Set
        End Property
    End Class

    Public Class securedControlClass
        Inherits originalControlClass
        Public Shadows Property name As String
            Get
                'return value from base class
                Return MyBase.name
            End Get
            Set(value As String)
                'Run anti-XSS code and pass result to base class
                MyBase.name = antiXSS(value)
            End Set
        End Property
    End Class
End Module 

在这里,securedControlClass继承了originalControlClass,但是遮蔽了'name'属性。这意味着对securedControlClass.*name*的任何调用都将始终转到其属性实现,而不是originalControlClass的实现。

使用此解决方案,您将需要为每个要覆盖其属性的控件创建一个新类。您还需要浏览代码并更改对原始控件(即originalControlClass)的所有引用为您的新版本(即securedControlClass)。这可能需要一些时间,具体取决于您拥有多少控件以及它们被使用的次数,但我相信这应该会导致最小的错误。

需要考虑的几个问题:

  1. 这不是长期解决方案。如果您能够直接修改控件以添加XSS代码,则可以避免一些复杂性。
  2. 您必须确保所有参与项目的人都使用受保护的控件而不是其他控件,否则您将拥有易受攻击的控件:)

谢谢charlessw。这个方法可能可行,但我们试图避免改变引用和创建新类。我想看看是否可以覆盖/扩展现有控件的文本属性,以便强制所有当前和未来的引用使用anti-xss库。非常感谢您的时间。 - christok

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接