首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >扩展/重写现有ASP.NET控件

扩展/重写现有ASP.NET控件
EN

Stack Overflow用户
提问于 2014-03-18 15:10:06
回答 2查看 1.3K关注 0票数 5

我有一个带有大量标签、文本框和其他web控件的项目。实际上有几百个。

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

我还尝试使用实现IExtenderProvider的类重写text属性,但无法获得帮助。

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

有什么想法吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-03-19 02:57:27

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

代码语言:javascript
复制
label.Text = HttpUtility.HtmlEncode(user.Name)

(注:我所说的“纯文本”是指像< and &等字符没有任何特殊含义的文本。)

第二,作为一种额外的深入防御措施,您应该在收集用户输入时验证它.但是输入验证是,而不是,它否定了正确编码用户输入的需要(因为某些东西可能会被忽略)。总是对用户输入进行编码!

好的,假设您将在时间和测试允许的情况下这样做,但是您现在需要快速修复,。您可以创建更改特定类型控件呈现方式的控制适配器。下面是一个示例,它为应用程序中的每个<asp:Label>添加了一些星号:

代码语言:javascript
复制
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文件夹中,该文件夹列出您正在调整的每种控件类型:

代码语言:javascript
复制
<browsers>
    <browser refID="Default">
        <controlAdapters>
            <adapter
                controlType="System.Web.UI.WebControls.Label"
                adapterType="TempVBWebApp.LabelControlAdapter, TempVBWebApp" />
        </controlAdapters>
    </browser>
</browsers>
票数 1
EN

Stack Overflow用户

发布于 2014-03-19 00:56:16

我假设,由于某种原因,您无法修改现有控件的代码,否则只需向它们添加反xss代码即可。

在这种情况下,您可以使用VB.Net:http://msdn.microsoft.com/en-us/library/1h3wytf6.aspx的阴影功能。

下面是如何实现它的一个示例:

代码语言:javascript
复制
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). )。这可能需要一段时间,这取决于您有多少控件以及它们被使用了多少次,但我认为这应该会导致最小的错误。

有几个问题需要考虑:

  1. 这并不是一个好的长期解决方案。如果您能够直接修改控件以添加XSS代码,它会增加一些可以避免的复杂性。
  2. 您必须确保在项目中工作的每个人都使用安全控件,而不是其他控件,否则您将拥有易受攻击的控件:)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22483396

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档