级别: 中级 Todd Kaplinger (todkap@us.ibm.com), Project Zero 架构师和开发, IBM Masayoshi Teraguchi (teraguti@jp.ibm.com), 资深研究成员, IBM Gang Chen (gangchen@us.ibm.com), IBM Software Services for WebSphere, IBM
2007 年 12 月 03 日 借助活动内容过滤(Active Content Filtering,ACF)避开对 Web 2.0 应用程序的常见攻击(例如跨站脚本)并显著提高 Project Zero 应用程序的安全性。ACF 是 Project Zero 内的一个可分解组件,ACF 提供的库能从请求数据(例如请求参数)和发送到客户机的响应输出中删除活动内容。通过本文,您将了解如何将 ACF 应用到可能包含活动内容的 Project Zero 环境以及这样做所能带来的强大功能。
ACF 简介
要了解 ACF,首先要对 Project Zero 有大致的认识。如下内容摘自 Project Zero Web 站点:
“Project Zero 是 IBM® 内部发起的一个孵化器项目,侧重于下一代动态 Web 应用程序的敏捷开发。 Project Zero 引入了一种简单的环境,基于流行的 Web 技术创建、组装和执行应用程序。Project Zero 环境包括一个面向 Groovy 和 PHP 的脚本运行时,且具有应用程序编程接口,这些接口针对 REST 风格服务、集成 mashup 和富 Web 接口的生成进行了优化。”
Project Zero 主要针对的是一下代动态 Web 应用程序(通常归类为 Web 2.0),本文侧重于交互式 Web 应用程序,这些应用程序可能会包含用户提供的内容,比如 mashup、wiki 和 blog。为了支持这些应用程序,Project Zero 提供了 ACF 库,应用程序开发人员可以将其包括在 Zero 应用程序之内。ACF 让开发人员能够避开经常在这类应用程序出现的跨站脚本等问题(有关跨站脚本的描述,请参见 参考资料)。
关于示例
本文提供的示例旨在借助由简到难的用例充分展示 ACF 。这些示例均构建在之前的示例之上。如下是这些示例的一个摘要,每个示例会在随后的章节详细加以介绍:
- 示例 1 是一个很基本的、启用了 Ajax 的页面,它让用户能够向从外部收到的文章发表评论。这个示例展示了若用户评论或文章中包含活动内容 — 比如 JavaScript — 情形将会如何。
- 示例 2 构建在示例 1 的基础上,并包含对 ACF 库的支持。这个示例展示了当文章中包含活动内容 — 比如 JavaScript — 时 ACF 过滤功能如何工作。
- 示例 3 构建在示例 2 的基础上,并支持对请求参数的 ACF 过滤功能。这个示例展示了当用户评论中包含活动内容 — 比如 JavaScript — 时 ACF 过滤功能如何工作。
 |
Project Zero 社区
请查阅 Project Zero Web 站点,了解 Project Zero 如何为如今的 Web 应用程序提供功能强大 — 却极为简单的 — 开发和执行平台。这个活跃的 社区 会讨论项目开发、为开发人员提供帮助并且也很愿意听听您的高见! |
|
可以从本文的 下载 部分下载这个示例应用程序,以获得使用 ACF 特性的实际操作经验。此示例应用程序模拟了一种 Web 新闻聚合和 blog 应用程序,它允许向服务器发表对当日新闻的评论,服务器反过来又会向其他查阅者显示这些评论。如 图 1 所示,页面的顶部显示了新闻聚合的结果,从中可以看到被注入的潜在恶意内容(闪动的红色文本)。单击 Original source of the news 标题窗格会显示新闻聚合的原始 HTML 内容。也可以在底部的文本区域 Enter your comments here 发表评论,单击 Post your comment 按钮后,评论就会立即显示在 All comments 区域。
图 1. ACF 示例
我们将使用 IBM 最新的 Web 2.0 平台 Project Zero 来构建服务器端的组件。此示例应用程序的前端使用的是新兴的 Dojo 和 Ajax 技术。
要运行本文包括的这个示例应用程序,需要正确配置 Eclipse 开发 IDE 和 Project Zero 插件(有关这个插件的链接,可以在 参考资料 部分找到。可以参考本文进行设置)。准备好后,就可以将示例应用程序(名为 ACFSampleApp-1.0.0.zip)作为 Existing Project 导入到工作空间。选择 archive file as source(参见 图 2)。Project Zero 通过 zero.acf 库提供对 ACF 的支持,而这个库已经作为应用程序的依赖项之一在 ivy.xml 文件中配置。
图 2. 将 ACFSampleApp 导入 Eclipse 工作空间
要启动 ACF 特性,需要右键单击 ACFSampleApp 并选择 Run as – Project Zero Application。之后,服务器组件就会开启并运行。接下来,将浏览器指向 http://localhost:8080 以测试这个示例应用程序。
场景 1:ACF 响应过滤
第一个场景是使用 ACF 响应过滤阻止恶意内容。ACF 响应过滤能够基于一组过滤规则(在本文稍后部分介绍)从响应消息中剥离活动内容(比如 JavaScript)。在运行示例应用程序时,可以看到在页面顶部的新闻头部已经注入了闪烁显示的恶意文本,这些恶意文本源自第一个新闻提要的某些活动内容(JavaScript 代码)。通过单击 Original source of the news 标题框可以查看此新闻提要的源代码,如 图 3 所示:
图 3. 新闻头部的恶意文本
现在,我们来看看如何使用 ACF 响应过滤阻止这些恶意文本对应用程序进行破坏。ACF 响应过滤可由 zero.config 配置文件控制。要启用 ACF 响应过滤,需要如下条目(参见 清单 1):
清单 1. 配置响应过滤
[@include ${zero.acf}/config/acf.config]
uri=/resources/newsViewer
|
这个示例提供了此配置。要启用 ACF,只需在 zero.config 文件中去掉对这部分的注释并重启 Project Zero 服务器即可。如图 4 所示,配置属性中的这两行就可以告知 ACF 引擎使用 ACF 提供的默认预定义规则集过滤掉源自 URI /resources/newsViewer 的任何活动内容。
图 4. 配置 ACF 响应过滤
再次运行此应用程序,就不会看到闪烁显示的烦人文本了。
场景 2:ACF 请求过滤
处理以 Web 2.0
为主题的应用程序通常都会允许用户向托管服务器输入或发表内容。这就引入了恶意文本(比如 JavaScript)由服务器呈现时的安全性问题。在示例应用程序中,用户可以向服务器发表评论。要展示恶意脚本的破坏性,可以在 Enter comments 区域输入清单 2 所示的文本:
清单 2. 示例恶意脚本
<script>alert("You are under attack!")</script>
|
单击 Post your comment 按钮,会看到 All comments 结果区域为空白,这时,烦人的 JavaScript 以弹出的方式显示。
那么,该如何过滤 HTTP 请求和阻止恶意 JavaScript 攻击呢?为实现此目的,ACF 提供了一组功能强大的 API。这些 API 会基于一组过滤规则告诉您是否有活动内容(比如 JavaScript)包含在 HTTP 请求参数中。如果找到了活动内容,就可以抛出一个适当的异常并使用 Project Zero 的另一个库(称为 XMLEncoder,可以对这些活动内容进行编码)以确保它不会在运行时执行。在我们的示例中,处理外来的注释 POST 请求的服务器端组件是 commentHandler.groovy 类。这也是添加 ACF 请求过滤代码的地方。可以通过去掉对本文所提供的代码的注释来启用此特性,如 图 5 所示:
图 5. 启用 ACF 请求过滤
这次无需重启 Zero 服务器就可以测试此特性。重载应用程序页面并在评论区域张贴相同的 JavaScript。很显然,您将不能再张贴有害的内容,如 图 6 所示:
图 6. ACF 请求过滤的一个示例
客户端过滤
至此,您已经见识到了 ACF 在阻止恶意攻击方面的强大功能,主要用于服务器端。要进一步增强应用程序的安全性,可以考虑使用由一些现代的 JavaScript 库引入的某些客户机端的编码特性,比如 Dojo 框架。Dojo 的富文本编辑器可以自动将用户输入编码成相对安全的 HTML 代码。注意:虽然客户端编码非常有用,但它并不能取代服务器端的 ACF 过滤,原因是用户不用费太多力气就可以破解客户端过滤。
本文中的示例应用程序提供了一种基于 Dojo 的富文本编辑器。要测试此应用程序,需要将浏览器指向 http://localhost:8080/clientfilter.gt。如 图 7 所示,通过 Dojo 编辑器张贴的 JavaScript 在发送给服务器之前就已经编码完毕。因此,所张贴的内容将不会被浏览器解释为活动 JavaScript。
图 7. Dojo 编辑器实现
结束语
通过本文,您已经看到了 ACF 是如何通过启用过滤活动内容来为应用程序部署提供增强的灵活性的,而且整个过程无需开发人员对应用程序进行任何重大更改。这种增强的灵活性让应用程序能够更好地远离活动内容方面的问题,比如跨站脚本(XSS),XSS 是很多 Web 2.0 应用程序上常见的攻击。请试用这个示例应用程序并将您的反馈通过 Project Zero 论坛提供给我们(参见 参考资料)。
下载 | 描述 | 名字 | 大小 | 下载方法 |
|---|
| 本文中的示例应用程序 | wa-pz-acf.zip | 50KB | HTTP |
|---|
参考资料 学习
获得产品和技术
讨论
作者简介  | 
|  | Todd Kaplinger 是 IBM Software Group 的一名高级软件工程师,现任 Project Zero Security 团队的负责人和架构师。Todd 是诸如 JSP、Servlet 和 PHP 这类基于 Web 的技术专家,目前专注于研究新兴的 Web 2.0 技术及该技术对企业的影响。Todd 现在是负责 JSR 223: Scripting for the
Java Platform 的专家组成员,,他也是 Open AJAX Alliance 的一员,致力于各种安全性方面的 Ajax 框架实现间的互操作性研究。Todd
曾担任过 IBM WebSphere Webcontainer 和 Remote Request Dispatcher (RRD) 项目的团队负责人和架构师,并曾作为 IBM Servlet 专家组的代表参与 JSR 154 Servlet 2.5 规范研究。 |
 | 
|  | Masayoshi Teraguchi 是 IBM Tokyo Research
Laboratory 的一名资深研究成员。Masayoshi 在过去 5 年中一直研究 XML、Web Services 和 Web Services
Security (WSS)。他目前的研究重点是 Web 2.0 安全性和性能。 |
对本文的评价
|