在 Web 应用程序中防止脚本利用

发布时间: 2007-04-19 10:36    作者: 未知    来源: 未知    浏览:    评论

大多数脚本利用发生在用户可以将可执行代码(脚本)插入您的应用程序时。默认情况下,ASP.NET 提供请求验证。不管窗体发送包含什么样的 HTML,该验证都会引发错误。

您可以使用下列方法防止脚本利用:

  • 在接受或显示字符串之前,将 HTML 编码应用于它们,以便字符串不包括任何可执行元素。
  • 如果您的应用程序需要接受某些 HTML,则禁用请求验证并创建您自己的 HTML 筛选器。

本主题中的过程说明如何执行这些任务。

应用 HTML 编码

HTML 编码使用 HTML 保留字符转换 HTML 元素,以便显示它们而不是执行它们。

应用 HTML 编码

  • 在显示字符串之前,调用 Server 对象的 asp">HtmlEncode 方法。HTML 元素会转换为浏览器将显示(而不解释为 HTML)的字符串表示形式。

    以下示例说明 HTML 编码。在一个实例中,在显示用户输入之前对其进行编码。在第二个实例中,在显示数据库中的数据之前对其进行编码。

    注意   只有通过向 asp">@ Page 指令中添加 alidateRequest="false" 来在页中禁用请求验证时,此示例才将起作用。决不禁用请求验证而不添加您自己的检查或筛选器。
    ' Visual Basic
        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e _
        As System.EventArgs) Handles Button1.Click
        Label1.Text = Server.HtmlEncode(TextBox1.Text)
        Label2.Text = _
        Server.HtmlEncode(dsCustomers.Customers(0).CompanyName)
        End Sub
        // C#
        private void Button1_Click(object sender, System.EventArgs e)
        {
        Label1.Text = Server.HtmlEncode(TextBox1.Text);
        Label2.Text =
        Server.HtmlEncode(dsCustomers1.Customers[0].CompanyName);
        }

筛选 HTML 元素

默认情况下,Web 窗体页检测发送到服务器的信息中的任何 HTML 元素和保留字符。这样,将防止用户试图将脚本嵌入您的应用程序。当页检测到 HTML 时,它会引发一个错误。您可以使用 Page_Error 或 Application_Error 处理程序捕捉此错误。有关详细信息,请参见asp">显示安全的错误信息。

但是,如果您的应用程序需要接受某些 HTML 元素,可关闭请求验证,并创建一个只允许使用要接受的 HTML 元素的筛选器。

注意   不要创建试图只筛选出不可接受元素的筛选器,因为预料每个可能的错误输入十分困难。相反,如果您创建筛选器,则创建一个定义可接受输入的筛选器。

筛选 HTML 元素

  1. 通过将属性 ValidateRequest="false" 添加到 asp">@ Page 指令中禁用请求验证。
    安全说明   决不要禁用自动请求验证而不添加您自己的检查或筛选器。
  2. 使用 asp">HtmlEncode 方法对字符串进行编码。
  3. 调用 asp">String.Replace 方法,将要接受的已编码 HTML 标记转换回它们的 HTML 形式。
    提示   如果您熟悉正则表达式,则可以使用一个正则表达式来高效地执行筛选。有关详细信息,请参见 asp">.NET Framework 正则表达式。

    以下示例说明一个简单的筛选器,它接受加粗元素和带下划线的元素(<b>、</b>、<u>、</u>)。在显示所有其他用户输入之前都对其进行编码。

    安全说明   许多 HTML 标记都允许在其属性中使用脚本。例如,标记 <img src="javascript:alert('hi')"> 是合法的。如果您希望接受比简单的格式设置标记更复杂的 HTML 标记,则必须确保恶意用户无法假借允许的 HTML 标记将脚本传递到您的应用程序。
    ' Visual Basic
        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim userinput As String = TextBox1.Text
        userinput = Server.HtmlEncode(userinput)
        ' Accepts <b>, </b>, <u>, </u>, case-insensitive
        userinput = userinput.Replace("&lt;b&gt;", "<b>")
        userinput = userinput.Replace("&lt;/b&gt;", "</b>")
        userinput = userinput.Replace("&lt;B&gt;", "<B>")
        userinput = userinput.Replace("&lt;/B&gt;", "</B>")
        userinput = userinput.Replace("&lt;u&gt;", "<u>")
        userinput = userinput.Replace("&lt;/u&gt;", "</u>")
        userinput = userinput.Replace("&lt;U&gt;", "<U>")
        userinput = userinput.Replace("&lt;/U&gt;", "</U>")
        Label1.Text = userinput
        End Sub
        // C#
        private void Button1_Click(object sender, System.EventArgs e)
        {
        String userinput = TextBox1.Text;
        userinput = Server.HtmlEncode(userinput);
        // Accepts <b>, </b>, <u>, </u>, case-insensitive
        userinput = userinput.Replace("&lt;b&gt;", "<b>");
        userinput = userinput.Replace("&lt;/b&gt;", "</b>");
        userinput = userinput.Replace("&lt;B&gt;", "<B>");
        userinput = userinput.Replace("&lt;/B&gt;", "</B>");
        userinput = userinput.Replace("&lt;u&gt;", "<u>");
        userinput = userinput.Replace("&lt;/u&gt;", "</u>");
        userinput = userinput.Replace("&lt;U&gt;", "<U>");
        userinput = userinput.Replace("&lt;/U&gt;", "</U>");
        Label1.Text = userinput;
        }
Smile Big Smile Surprise Stick out tongue Wink Sad Tongue Tied Indifferent Crying Embarrassed Cool Angry Angel Devil [8-|] [:#] [:-*] [:^)] [<:o)] [|-)] Yes Beer Left Hug Music Star Time Snail Pizza Automobile Umbrella Computer Storm [mo] [8o|] [^o)] [+o(] [*-)] [8-)] Coffee No Drinks [Z] Right Hug Cake Broken Heart Gift Wilted Flower Movie Dog Idea Sleep Email Travel Paradise
呢称:

加粗 斜体 下划线 链接 图片 代码 邮件地址 引用 列表

最多只能输入100个字符

Tags

SQL 数据库 asp.net C# XML 控件 .NET教程 程序 事件 数据 安全 代码 Server 客户端 验证 数据库专栏 接口 文件 Oracle DataSet 函数 DataGrid 问题 .net return C#语言 JavaScript 服务 IIS 对象 语句 windows 继承 时间 web.config 设计 开发 参数 变量 解决 字符 ADO.net 环境 VB.Net语言 web 异常 工具 服务器 计算 实例 OLEDB Application VB Word WebService insert asp net 安装 记录

精华推荐

更多

精品下载

更多