IBM®
跳转到主要内容
    中国 [选择]    使用条款
 
 
Select a scope: Search for:    
    首页    产品    服务与解决方案     支持与下载    个性化服务    
跳转到主要内容

developerWorks 中国  >  Web development | WebSphere  >

将 Active Content Filtering 用于 Project Zero 和 WebSphere sMash 应用程序的安全性

通过管理活动内容提高应用程序的安全性

developerWorks
文档选项

未显示需要 JavaScript 的文档选项

样例代码

英文原文

英文原文


级别: 中级

Todd Kaplinger, 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 日
更新 2008 年 7 月 15 日

借助活动内容过滤(Active Content Filtering,ACF)避开对基于 Web 2.0 的应用程序的常见攻击(例如跨站点脚本)并显著提高 Project Zero 应用程序的安全性。ACF 是 Project Zero 内的一个可分解组件,ACF 提供的库能从请求数据(例如请求参数)和发送到客户机的响应输出中删除活动内容。通过本文,您将了解如何将 ACF 应用到可能包含活动内容的 Project Zero 环境以及这样做所带来的强大功能。

编辑留言:IBM® WebSphere® sMash 和 IBM WebSphere sMash Developer Edition 基于倍受称赞的 Project Zero 孵化器项目。Project Zero 是针对 WebSphere sMash 的开发社区,它将继续为开发人员提供免费的平台,使他们能够利用最新的构建、特性和社区支持开发应用程序。

Web 2.0 技术资源中心

请访问 Web 2.0 技术资源中心,这是有关 Web 2.0 相关信息的一站式中心,包括大量 Web 2.0 技术文章、教程、下载和相关技术资源。您还可以通过 Web 2.0 新手入门 栏目,迅速了解 Web 2.0 的相关概念。

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 让开发人员能够避开经常在这类应用程序出现的跨站点脚本等问题(有关跨站点脚本的描述,请参见 参考资料)。

关于示例

作者留言:初次写完本文时,应用程序开发人员必须通过声明方法(在应用程序的 zero.config 中定义显式规则)或编程方法(使用提供的 API)来利用 ACF。根据 Project Zero 社区和本文读者反馈的信息,开发团队为以下场景提供某些默认级的 ACF 保护(要求将 zero.acf 添加为依赖项):

  • 请求参数:从所有发送到 URI 的入站请求参数中删除活动内容(比如 JavaScript、Applet 和 ActiveX)。这些参数被看作是 HTML 片段。
  • JSON 内容请求:从发送到 URI 的入站 JSON 对象的所有 String 值中删除活动内容。在这种情况下,已经指定所有内容的类型。
  • JSON 内容响应:从 URI 发送的出站 JSON 对象的所有 String 值中删除活动内容。在这种情况下,已经指定除 “text/html” 以外的所有内容类型。

要取消默认的 ACF 启用,下面的配置选项包含了示例应用程序的 zero.config"/config/acf/enableByDefault=false"。因为在某些情况下默认启用有可能不能满足应用程序的要求,本文将把焦点集中在通过声明和编程方法利用 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 示例
ACF 示例应用程序

我们将使用 IBM 最新的 Web 2.0 平台 Project Zero 来构建服务器端的组件。此示例应用程序的前端使用的是新兴的 Dojo 和 Ajax 技术。

Project Zero 通过 zero.acf 库提供 ACF 支持,这个库被配置为 ivy.xml 文件的一个应用程序依赖项。本文提供了一个包含示例应用程序(名为 ACFSampleApp-1.0.0.zip)的 zip 文件。请使用 zip 工具将这个文件解压缩到磁盘。

针对命令行用户:

  1. 根据说明在 WebSphere sMash Web 站点上安装 IBM WebSphere sMash 命令行实用程序(参见 参考资料)。
  2. 回到解压缩示例应用程序的目录。
  3. 通过 zero start 开始应用程序。

针对应用程序构建用户:

  1. 根据说明在 WebSphere sMash Web 站点上安装 IBM WebSphere sMash 命令行实用程序(参见 参考资料)。
  2. 通过导航到安装 CLI 的 zerodirectory 目录并运行 “startAppBuilder” 脚本开始应用程序构建器。
  3. 使用面板左边的 “Browse Applications” 链接从 WebSphere sMash 存储库安装 OpenID 演示应用程序。
  4. 单击与 ACFSampleApp(参见 下载)应用程序相关联的播放按钮开始应用程序。

接下来,将浏览器指向 http://localhost:8080 以测试这个示例应用程序。

场景 1:ACF 响应过滤

第一个场景是使用 ACF 响应过滤阻止恶意内容。ACF 响应过滤能够基于一组过滤规则(在本文稍后部分介绍)从响应消息中剥离活动内容(比如 JavaScript)。在运行示例应用程序时,可以看到在页面顶部的新闻头部已经注入了闪烁显示的恶意文本,这些恶意文本源自第一个新闻提要的某些活动内容(JavaScript 代码)。通过单击 Original source of the news 标题框可以查看此新闻提要的源代码,如 图 2 所示:


图 2. 新闻头部的恶意文本
新闻头部的恶意文本

现在,我们来看看如何使用 ACF 响应过滤阻止这些恶意文本对应用程序进行破坏。ACF 响应过滤可由 zero.config 配置文件控制。要启用 ACF 响应过滤,需要如下条目(参见 清单 1):


清单 1. 配置 ACF 响应过滤
                
# ACF filter rule
@include "${/config/dependencies/zero.acf}/config/acf.config"{
	"conditions" : "/request/path =~ /resources/newsViewer(.*)"
}

这个示例提供了此配置。要启用 ACF,只需在 zero.config 文件中去掉对这部分的注释并重启 Project Zero 服务器即可。如图 3 所示,配置属性中的这两行就可以告知 ACF 引擎使用 ACF 提供的默认预定义规则集过滤掉源自 URI /resources/newsViewer 的任何活动内容。


图 3. 配置 ACF 响应过滤
配置 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 请求过滤代码的地方。可以通过去掉对本文所提供的代码的注释来启用此特性,如 图 4 所示:


图 4. 启用 ACF 请求过滤
启用 ACF 请求过滤

这次无需重启 Zero 服务器就可以测试此特性。重新加载应用程序页面并在评论区域张贴相同的 JavaScript。很显然,您将不能再张贴有害的内容,如 图 5 所示:


图 5.ACF 请求过滤的一个示例
ACF 请求过滤的一个示例

客户端过滤

作者留言:上面描述的场景是默认 ACF 启用的理想用例。在这一场景,用户将通过用 JSON 编写的消息发布活动内容,这个消息与上面描述的 JSON 内容请求场景相匹配。在这一场景,在为应用程序提供已解码的 JSON 数据之前,将从 JSON 值中删除 JSON 字符串的恶意部分。

到目前为止,您主要是在服务器端看到了 ACF 在阻止恶意攻击方面的有力保护。要进一步提高应用程序的安全性,必须考虑使用一些现代 JavaScript 库引入的客户端编码功能,比如 Dojo 框架。例如,Dojo 的富文本编辑器能够自动地将用户输入的内容编码为 HTML 代码,使用这些代码是相对安全的。注意:虽然客户端编码非常有用,但是它不能够代替在服务器端的进行 ACF 过滤,因为用户能够轻易地避开在客户端执行的操作。

本文中的示例应用程序提供了一种基于 Dojo 的富文本编辑器。要测试此应用程序,需要将浏览器指向 http://localhost:8080/clientfilter.gt。如 图 6 所示,通过 Dojo 编辑器张贴的 JavaScript 在发送给服务器之前就已经编码完毕。因此,所张贴的内容将不会被浏览器解释为活动 JavaScript。


图 6. Dojo 编辑器实现
Dojo 编辑器实现

作者留言:上面描述的场景是默认 ACF 启用的理想用例。在这个场景中,用户将通过编码为 url 形式的消息发布活动内容,这个消息与上面描述的请求参数场景相匹配。在这个场景,在应用程序访问请求参数之前,将从请求参数中删除请求参数值中的恶意部分。

结束语

通过本文,您已经看到了 ACF 是如何通过启用过滤活动内容来为应用程序部署提供增强的灵活性的,而且整个过程无需开发人员对应用程序进行任何重大更改。这种增强的灵活性让应用程序能够更好地远离活动内容方面的问题,比如跨站点脚本(XSS),XSS 是很多 Web 2.0 应用程序上常见的攻击。请试用这个示例应用程序并将您的反馈通过 Project Zero 论坛提供给我们(参见 参考资料)。






回页首


下载

描述名字大小下载方法
本文的示例应用程序ACFSampleApp-1.0.0.zip32KBHTTP
关于下载方法的信息


参考资料

学习

获得产品和技术
  • 获取 Project Zero Eclipse 插件,其中包括一个安装程序,安装后可从 Zero 包存储库下载额外的 Zero 运行库。

  • 下载 Project Zero 并开始应用在本文中学到的技能。


讨论


作者简介

Todd Kaplinger

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

Masayoshi Teraguchi 是 IBM Tokyo Research Laboratory 的一名资深研究成员。Masayoshi 在过去 5 年中一直研究 XML、Web Services 和 Web Services Security (WSS)。他目前的研究重点是 Web 2.0 安全性和性能。


Gang Chen

Gang Chen 是 IBM Software Services for WebSphere (ISSW) 方面经过认证的顾问 I/T 专家。Gang 擅长于帮助企业客户设计和实现电子商务应用程序。最近,他又在致力于对新兴的 Web 2.0 技术的研究,以为企业用户增值。他也是 IBM 红皮书 “IBM WebSphere Application Server V6 Scalability and Performance Handbook” 的作者之一。




对本文的评价










回页首


WebSphere 是 IBM Corporation 在美国和/或其他国家的商标。 Java 和所有基于 Java 的商标是 Sun Microsystems, Inc 在美国和/或其他国家的商标。 其他公司、产品或服务的名称可能是其他公司的商标或服务标志。

IBM 公司保留在 developerWorks 网站上发表的内容的著作权。未经IBM公司或原始作者的书面明确许可,请勿转载。如果您希望转载,请通过 提交转载请求表单 联系我们的编辑团队。
    关于 IBM 隐私条约 联系 IBM 使用条款