我有一个带有大量标签、文本框和其他web控件的项目。实际上有几百个。
我现在希望能够覆盖某些属性,以便通过一个反XSS库运行内容。例如,当我使用数据库中的数据设置标签的text属性时,我希望自动运行一个函数来清除任何潜在的恶意代码。
我还尝试使用实现IExtenderProvider的类重写text属性,但无法获得帮助。
如果我从零开始构建它,我可能选择创建一个继承系统label类的新label类。由于这个项目的规模,我宁愿不这么做。
有什么想法吗?
发布于 2014-03-19 02:57:27
首先,我将注意到,避免XSS漏洞的正确方法是在将用户输入嵌入到页面之前对其进行适当编码。例如,如果要将纯文本字符串分配给标签的text属性,则需要对该值进行编码,因为Text属性被逐字呈现为HTML:
label.Text = HttpUtility.HtmlEncode(user.Name)(注:我所说的“纯文本”是指像< and &等字符没有任何特殊含义的文本。)
第二,作为一种额外的深入防御措施,您应该在收集用户输入时验证它.但是输入验证是,而不是,它否定了正确编码用户输入的需要(因为某些东西可能会被忽略)。总是对用户输入进行编码!
好的,假设您将在时间和测试允许的情况下这样做,但是您现在需要快速修复,。您可以创建更改特定类型控件呈现方式的控制适配器。下面是一个示例,它为应用程序中的每个<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>发布于 2014-03-19 00:56:16
我假设,由于某种原因,您无法修改现有控件的代码,否则只需向它们添加反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's实现。
使用此解决方案,您必须为希望覆盖的每个控件的属性创建一个新类。您还必须遍历代码并更改对原始控件的所有引用(即originalControlClass)到新版本(即securedControlClass). )。这可能需要一段时间,这取决于您有多少控件以及它们被使用了多少次,但我认为这应该会导致最小的错误。
有几个问题需要考虑:
https://stackoverflow.com/questions/22483396
复制相似问题