我有一个项目,里面有许多标签、文本框和其他Web控件。它们实际上有数百个。
现在我想能够覆盖某些属性,以便通过反跨站脚本库运行内容。例如,当我使用来自数据库的数据设置标签的文本属性时,我希望自动运行一个函数,以清除任何潜在的恶意代码。
我还尝试使用实现IExtenderProvider接口的类覆盖文本属性,但是没有得到帮助。
如果我从头开始构建这个项目,我可能会选择创建一个继承系统标签类的新标签类。由于项目规模较大,我不想这样做。
有什么想法吗?
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
的类型并执行不同的操作。<browsers>
<browser refID="Default">
<controlAdapters>
<adapter
controlType="System.Web.UI.WebControls.Label"
adapterType="TempVBWebApp.LabelControlAdapter, TempVBWebApp" />
</controlAdapters>
</browser>
</browsers>
我假设由于某种原因,您无法修改现有控件的代码,否则您可以将反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)。这可能需要一些时间,具体取决于您拥有多少控件以及它们被使用的次数,但我相信这应该会导致最小的错误。
需要考虑的几个问题:
CustomControl: Control
并且覆盖Render()
等方法。 - Murali Murugesan