我有一个包含大量标签,文本框和其他网页控件的项目。其中有数百个。
我现在希望能够覆盖某些属性,以便通过反XSS库运行内容。例如,当我使用数据库中的数据设置标签的text属性时,我想自动运行一个函数来清除任何潜在的恶意代码。
我还尝试使用实现IExtenderProvider的类来覆盖text属性,但我无法帮助它。
如果我从头开始构建这个,我可能选择创建一个继承系统标签类的新标签类。由于项目的规模,我宁愿不这样做。
有什么想法?
答案 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 )。这可能需要一段时间,具体取决于您拥有多少控件以及使用它们的次数,但我相信它应该会导致最小的错误。
要考虑的几个问题: