65.9K
CodeProject 正在变化。 阅读更多。
Home

让你强大起来,抵御 XSS

2007年7月3日

CPOL

5分钟阅读

viewsIcon

42472

XSS正日益流行,用于入侵网站。本文将介绍如何防范XSS攻击。

Screenshot - sample.jpg

引言

通过禁用标签验证请求(validationrequest=false),您能保护您的.Net应用程序页面免受XSS攻击吗?对于Web 2.0(用户生成内容)网站,我们需要允许用户输入一些可能存在危险的标签,这也会使我们的应用程序面临被利用的风险。我们无法启用默认的验证请求。那么,我们如何才能保护自己免受这些危险的攻击呢?

一种阻止使用危险标签进行攻击的方法是过滤它们。但是,入侵系统的方法太多了。有些方法在过滤时甚至不危险,但它可能在应用程序中造成大规模攻击。其中一个标签如下所示:

guestbook.aspx?MainID=-1%20union%20select%201,2,3,4,5,usertitle,7,8,9,10,11,12,13%20from%20Member%20where%20Memberid%20=1/*

上述代码是SQL注入,可能会泄露根用户或管理员用户的数据。我们能通过我们的方法过滤掉它吗?当然不能,因为这可能是一些用户在论坛中发布的正确SQL。那么,我们如何防范这类攻击呢?

IDS – 入侵检测系统

IDS用于检测和阻止对我们网站的危险流量。我们通常会设置一些蜜罐,它们会诱捕黑客,让他们寻找虚假信息并将其阻止。想象一下.Net应用程序的IDS。如何使用IDS方法扫描用户数据?本文将介绍一个由一些白帽安全专家开发的IDS。

欢迎来到Dotnet IDS的世界。

Dotnet IDS是PHP-IDS的.Net版本,由一些安全专家开发。您可以在http://code.google.com/p/dotnetids/上获取dotnet-IDS的副本,这是该项目的主页。该工具能够检测Web应用程序上的攻击,并为开发人员提供反应的可能性。该工具是您网站抵御XSS攻击的第一道防线。

使用代码

首先我们需要知道它只是一个安全层,它会检测我们应用程序上的XSS攻击并通知开发人员。开发人员有责任对入侵采取行动以阻止它们。为了简单解释,让我们以一个留言簿应用程序为例,它接收用户的输入并存储。为了开发这样的应用程序,我们需要一个留言簿表单和一个感谢页面,并连接到数据库。

在您的IDE中创建一个新网站,并将ids.dll包含在bin目录中并引用它。
创建一个名为IDS的目录,并将output_filter.xml和default_filter.xml放置在bin目录中,以使系统正常工作。

放置好后,您可以通过将dotnetids命名空间包含到您的应用程序中来开始工作。

[Vb.net]
Imports DOTNETIDS

现在您需要更改代码隐藏文件以从SecurePage继承。

[Vb.net]
Partial Class _Default
    Inherits DOTNETIDS.SecurePage


继承SecurePage后,您需要在您的类中添加以下方法:

[VB.NET]

Public Overrides Sub IDSEventHandler(ByVal report As DOTNETIDS.Report, ByVal SecurePage As DOTNETIDS.SecurePage)
        Select Case report.RequestType
            Case DOTNETIDS.RequestType.Output
                WriteResponse()
                Exit Select
            Case Else
                For Each e As DOTNETIDS.Event In report.Events
                    Response.Write("Intrustion attempt: " & HttpUtility.HtmlEncode(e.Value) & " with impact " & e.Impact)
                Next
                Exit Select
        End Select
    End Sub


完成此步骤后,您的页面已准备好检测入侵。

每当页面从服务器发布/检索时,Dot net IDS都会扫描整个页面以查找入侵。如果发现,它将通知开发人员一个影响值和导致入侵尝试的值。如果我们需要更多信息,例如哪个过滤器触发了影响,我们可以将response.write更改为:

[VB.NET]

Response.Write("Intrustion attempt: " & HttpUtility.HtmlEncode(e.Value) & " found by " & HttpUtility.HtmlEncode(e.Filter) & " with impact " & e.Impact)

这将帮助我们找到哪个过滤器触发了警报。之后,由开发人员决定如何处理问题。dotnetids的开发人员建议对入侵尝试采取以下措施:

影响值4及以上用于记录到数据库,
影响值8及以上用于向开发人员发送邮件,
影响值24及以上用于显示警告
影响值48及以上用于销毁会话(如果用户已登录)——也可以通过会话增加影响值。

排除项

有时我们可能需要DotnetIDS排除用户的一些输入。我们可以通过使用排除项来实现这一点。我们可以使用排除方法来排除页面中的某些部分不被扫描。
vb.net

    Exclusions.Add("txtPosts")

上面的代码将排除名为txtPosts的标签不被扫描。最新版本的Dotnetids还支持排除完整的扫描输出。根据我的使用经验,我发现dotnetids在大多数XSS攻击中都非常有用。尽管它是一个新产品,但它对许多攻击都非常强大。有人可以帮助您解决任何疑问。有一个友好的论坛可供提问。

关注点

1) Dotnet IDS只是一个扫描器。
2) 开发人员必须编写代码来阻止尝试。

重要说明

本文使用NETIDS版本0.1.0。此版本存在一些缺点,已在版本0.1.3中得到纠正。此版本(0.1.0)的缺点是IDSevent将在页面加载事件触发后才进行验证。如果开发人员在页面加载事件中依赖查询字符串或其他对象进行输入(例如根据查询字符串中的用户ID加载数据),这仍然会为黑客留下攻击系统的机会,并造成损害。

我们已向团队指出此问题,并将IDSevent移至page_init事件。请仔细阅读可下载包中的readme文件以实现相同的功能。

有用链接

DotnetIDS:http://code.google.com/p/dotnetids/
论坛:http://forum.php-ids.org/?CategoryID=9
用法:http://code.google.com/p/dotnetids/wiki/Usage

使用这个工具一个月以来,我感觉它很容易实现,并且可以预防XSS。学习这段代码很容易,因为我们不需要做太多的编码工作。它基于正则表达式,可以快速扫描任何大小的页面。DotNetIDS在我们通常不使用HTML标签的地方(例如CMS页面)使用时会非常有效,在这些地方它可能会产生很多误报。

我们http://www.bepenfriends.com开始使用DotnetIDS重写整个应用程序。我们正在积极测试和实施dotnetIDS,并与他们合作解决问题。我们很高兴能在这方面为您提供帮助。

历史

1.0 初始版本
1.1 更新了所用原始工具的版本信息。

© . All rights reserved.