AntiSamy 1.0 发布:保护 Web 应用免受恶意 HTML 和 CSS 攻击

  • Gavin Terrill
  • 曹云飞

2007 年 12 月 5 日

话题:Java.NET安全架构语言 & 开发

跨站点脚本(Cross Site Scripting —— XSS),是允许用户提交包含 HTML 和 CSS 内容的开发者所面对的主要安全问题。 OWASP 上出现了一个的叫做 "AntiSamy" 的新项目,其目标是提供一个全面的、策略驱动的 API 来检验和清理用户的输入,同时在过滤过程中提供用户反馈。项目的主页描述了 API:

从技术上来说,AntiSamy API 可以保证用户提供的 HTML/CSS 内容遵从一个应用的规则。另外一种说法是:AntiSamy API 可以帮助你确保客户不会在他们提供的简介、评论等保存在服务器上的 HTML 中包含恶意代码。就 Web 应用而言,术语恶意代码通常仅指 JavaScript。样式表仅仅在它们调用 JavaScript 引擎的时候才被认为是恶意的。然而,有很多时候“正常的”HTML 和 CSS 也可以以一种恶意的方式来使用。

根据 AntiSamy 的领导开发者 Arshan Dabirsiaghi 的说法,这个 API 的特点是它的用户友好性:

AntiSamy 的方法的独特之处在于它是建立在一个积极的安全模型之上的,不论对 HTML 文档的格式还是文档的内容都是如此。另外的独特之处在于它试图以合作的精神来帮助用户调整他们的输入来通过校验,不是像当代的所有其他安全机制那样把用户当作潜在的攻击者来对待。

在论文 《向检测和除去恶意代码前进》 (PDF) 中,Dabirsiaghi 描述了过滤过程中包括的阶段:

  1. 预处理。使用NekoHTML来执行 HTML 清理。
  2. 处理。Tag/CSS 校验规则按照深度优先的算法应用三种处理模型——过滤,截尾和校验。过滤动作去掉不允许的标签,但是保留标签内的内容。截尾删除禁止的标签属性和标签的子节点。校验使用在策略文件中的规则来匹配标签 / 属性的组合,以确保只包含合法的标签。
  3. 补救。如果在处理过程中校验失败,可以与策略文件交互来决定如何处理标签和它的内容。选项包括删除标签以及它的内容,过滤掉标签而保留它的内容和从标签中删除属性。

AntiSamy 的第一个版本包括一个 Java 的实现,随后会提供.Net 和 PHP 的实现。

AntiSamy 易于与一个 Java 应用集成:

import org.owasp.validator.html.*;

Policy policy = new Policy(POLICY_FILE_LOCATION);



AntiSamy as = new AntiSamy();

CleanResults cr = as.scan(dirtyInput, policy);

MyUserDAO.storeUserProfile(cr.getCleanHTML()); // some custom function

CleanResults类提供了访问过滤过程的有用信息的方法:

  • getErrorMessages() —— 一个字符串错误信息列表
  • getCleanHTML() —— 干净的,安全的 HTML 输出
  • getCleanXMLDocumentFragment() —— 反应产生的干净的,安全的XMLDocumentFragment
  • getCleanHTML()
  • getScanTime() —— 返回以秒为单位的扫描时间

AntiSamy 采用 BSD 许可,可以在Google Code 项目主页下载。

查看英文原文AntiSamy 1.0 Released - Protecting web applications from malicious HTML and CSS
译者简介: 曹云飞,西安交通大学计算机软件硕士。现就职于Ethos,热衷于新技术的钻研,软件架构与敏捷开发,目前从事 Home Control 方面的工作。参与 InfoQ 中文站内容建设,请邮件至china-editorial[at]infoq.com
Java.NET安全架构语言 & 开发