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

chr*_*tok 5 vb.net asp.net

我有一个包含一大堆标签、文本框和其他 Web 控件的项目。字面上有数百个。

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

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

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

有什么想法吗?

Mic*_*Liu 1

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

label.Text = HttpUtility.HtmlEncode(user.Name)
Run Code Online (Sandbox Code Playgroud)

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

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

好的,我们假设您将在时间和测试允许的情况下执行此操作,但您现在需要快速修复。您可以创建控件适配器来更改特定类型控件的呈现方式。<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
Run Code Online (Sandbox Code Playgroud)

您可以为其他类型的控件创建附加的控件适配器,或者进行修改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>
Run Code Online (Sandbox Code Playgroud)