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

时间:2014-03-18 15:10:06

标签: asp.net vb.net

我有一个包含大量标签,文本框和其他网页控件的项目。其中有数百个。

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

我还尝试使用实现IExtenderProvider的类来覆盖text属性,但我无法帮助它。

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

有什么想法?

2 个答案:

答案 0 :(得分:1)

首先,我要注意,避免XSS漏洞的正确方法是在将用户输入嵌入页面之前对其进行正确编码。例如,如果要将纯文本字符串分配给Label的Text属性,则需要对该值进行编码,因为Text属性逐字呈现为HTML:

label.Text = HttpUtility.HtmlEncode(user.Name)

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

其次,作为额外的纵深防御措施,您应该在收集用户输入时对其进行验证。但输入验证否定了正确编码用户输入的需要(因为某些内容可能会漏掉)。 始终对用户输入进行编码!

好的,我们假设你会在时间和测试允许的情况下这样做,但你需要快速修复现在。您可以创建control adapters来更改特定类型的控件的呈现方式。这是一个为应用程序中的每个<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的类型并执行不同的操作。

您还需要将.browser文件添加到您网站的App_Browsers文件夹中,该文件夹列出了您正在调整的每种控件类型:

<browsers>
    <browser refID="Default">
        <controlAdapters>
            <adapter
                controlType="System.Web.UI.WebControls.Label"
                adapterType="TempVBWebApp.LabelControlAdapter, TempVBWebApp" />
        </controlAdapters>
    </browser>
</browsers>

答案 1 :(得分:0)

我认为由于某种原因您无法修改现有控件的代码,否则您只需将anti-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. 您必须确保每个参与项目的人都使用安全控件而不是其他控件,否则您将拥有易受攻击的控件:)