现在的位置: 首页 > 综合 > 正文

SAX解析XML

2013年07月09日 ⁄ 综合 ⁄ 共 10460字 ⁄ 字号 评论关闭

要解析的xml:

<?xml version="1.0" encoding="utf-8"?>
<advisory>
  <name>activeWeb contentserver 跨站点脚本编制</name>
  <testDescription>基础结构测试</testDescription>
  <threatClassification>
    <name>跨站点脚本编制</name>
    <reference>http://projects.webappsec.org/Cross-Site+Scripting</reference>
  </threatClassification>
  <testTechnicalDescription>
    <text>在返回给用户之前,activeWeb contentserver 不会适当清理传递给“msg”参数(rights.asp)的输入。</text>
    <text>可将其开发,以在整个站点上安装“跨站点脚本编制”攻击。</text>
    <br />
    <text>利用的样本:</text>
    <text>http://[SERVER]/errors/rights.asp?awReadAccessRight=True&amp;msg=[XSS]</text>
  </testTechnicalDescription>
  <causes>
    <cause>未安装第三方产品的最新补丁或最新修订程序</cause>
  </causes>
  <securityRisks>
    <securityRisk>可能会窃取或操纵客户会话和 cookie,它们可能用于模仿合法用户,从而使黑客能够以该用户身份查看或变更用户记录以及执行事务</securityRisk>
  </securityRisks>
  <affectedProducts>
    <affectedProduct>activeWeb contentserver(5.2964 以下的版本)</affectedProduct>
  </affectedProducts>
  <cve>
    <link target="http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2007-3014">CVE-2007-3014</link>
  </cve>
  <references>
    <link target="http://www.active-web.de/aw/home/Produkte/~gf/contentserver/">供应商站点</link>
    <link target="http://online.securityfocus.com/bid/24895">BugTraq BID: 24895</link>
    <link target="http://secunia.com/advisories/26063/">Secunia 咨询</link>
  </references>
  <fixRecommendations>
    <fixRecommendation type="General">
      <text>升级至 activeWeb contentserver 的最新版本。</text>
    </fixRecommendation>
  </fixRecommendations>
</advisory>

------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

解析上面的xml只需两个类即可:

package com.wk.common;

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;

import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

import org.xml.sax.InputSource;
import org.xml.sax.SAXException;

import com.wk.parser.XMLContentHandler;

/**
 * 这个类的作用是:
 * 对解析好的xml文件信息怎样处理
 * @author Administrator
 *
 */

public class ManagerImport {
 
 /**
  *
  * @param filePath
  * @throws SAXException
  * @throws IOException
  * @throws ParserConfigurationException
  */
 public static void saveXMLData(String filePath) throws SAXException, IOException, ParserConfigurationException{
  //建立SAX对象工厂
  SAXParserFactory  factory = SAXParserFactory.newInstance();
  //建立SAX对像
  SAXParser parser = factory.newSAXParser();
  XMLContentHandler x = new XMLContentHandler();
  InputStream stream=new FileInputStream(filePath);
  InputSource source = new InputSource(stream);
  parser.parse(source, x);
 }
 
 public static void main(String[] args) throws SAXException, IOException, ParserConfigurationException {
  saveXMLData("D:/activeWebcontentserverXSS.xml");
 }
}

------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

package com.wk.parser;

import java.io.IOException;

import org.xml.sax.Attributes;
import org.xml.sax.InputSource;
import org.xml.sax.Locator;
import org.xml.sax.SAXException;
import org.xml.sax.SAXParseException;
import org.xml.sax.helpers.DefaultHandler;
 /**
  * 解析xml的公共类
  * @author wk
  */

public class XMLContentHandler extends DefaultHandler {
 StringBuffer sb = new StringBuffer();
 
 /*
  * (non-Javadoc)
  * @see org.xml.sax.helpers.DefaultHandler#characters(char[], int, int)
  * 该方法是:接收元素中字符数据的通知。在这里你可以用new String(ch, start, length)
  * 把你想得到的信息得到
  * 参数:
  * ch - 字符。
  * start - 字符数组中的开始位置。
  * length - 从字符数组中使用的字符数。
  */
 
 public void characters(char[] ch, int start, int length)
   throws SAXException {
  
  if(new String(ch, start, length).toString().trim().length()!=0){
   System.out.println(new String(ch, start, length));
   sb.append(new String(ch, start, length));
  }
 }
 
 /*
  * (non-Javadoc)
  * @see org.xml.sax.helpers.DefaultHandler#endDocument()
  * 当一个xml文件解析完成以后会执行这个方法。
  * 默认情况下,不执行任何操作。应用程序编写者可以在子类中重写此方法,以便在文
  * 档的结束处采取特定的操作(如,结束树或关闭输出文件)。
  */
 
 public void endDocument() throws SAXException {
  System.out.println("【文件解析完成!】");
  
 }
 
 /*
  * (non-Javadoc)
  * @see org.xml.sax.helpers.DefaultHandler#endElement(java.lang.String, java.lang.String, java.lang.String)
  * 接收元素结束的通知
  * 默认情况下,不执行任何操作。应用程序编写者可以在子类中重写此方法,以便在每个
  * 元素的结束处采取特定的操作(如,结束树节点或将输出写入文件)。
  *
  * 参数:
  * uri - 名称空间 URI,如果元素没有任何名称空间 URI,或者没有正在执行名称空间处理,则为空字符串。
  * localName - 本地名称(不带前缀),如果没有正在执行名称空间处理,则为空字符串。
  * qName - 限定的名称(带有前缀),如果限定的名称不可用,则为空字符串。
  *
  */
 
 public void endElement(String uri, String localName, String qName)
   throws SAXException {
  
 }
 
 /*
  * (non-Javadoc)
  * @see org.xml.sax.helpers.DefaultHandler#endPrefixMapping(java.lang.String)
  * 接收名称空间映射结束的通知。
  * 默认情况下,不执行任何操作。应用程序编写者可以在子类中重写此方法,以便在每个前缀映射的
  * 结束处采取特定的操作。
  *
  * 参数:
  * prefix - 正在声明的名称空间前缀。
  */
 
 public void endPrefixMapping(String prefix) throws SAXException {
  
  super.endPrefixMapping(prefix);
 }
 
 /*
  * (non-Javadoc)
  * @see org.xml.sax.helpers.DefaultHandler#error(org.xml.sax.SAXParseException)
  * 接收可恢复的解析器错误的通知。
  * 默认实现不执行任何操作。应用程序编写者可以在子类中重写此方法,以便对每个错误采取特定的措施,
  * 如在日志文件中插入消息,或者将它打印到控制台。
  *
  * 参数:
  * e - 被编码为异常的警告信息。
  */
 
 public void error(SAXParseException e) throws SAXException {
  
  super.error(e);
 }

 /*
  * (non-Javadoc)
  * @see org.xml.sax.helpers.DefaultHandler#fatalError(org.xml.sax.SAXParseException)
  * 报告严重的 XML 解析错误。
  * 默认的实现抛出 SAXParseException。如果应用程序编写者需要对每个严重的错误采取特定的措施
  * (如将所有的错误收集到一个报告中),则可以在子类中重写此方法:当调用此方法时,无论哪种情况,
  * 应用程序都必须停止所有的常规处理,这是因为文档已不再可靠,并且解析器再也不能报告解析事件
  *
  * 参数:e - 被编码为异常的错误信息。
  */
 
 public void fatalError(SAXParseException e) throws SAXException {
  
  super.fatalError(e);
 }
 
 /*
  * (non-Javadoc)
  * @see org.xml.sax.helpers.DefaultHandler#ignorableWhitespace(char[], int, int)
  * 接收处理指令的通知
  *
  * 默认情况下,不执行任何操作。应用程序编写者可以在子类中重写此方法,以便对每个处理指令
  * 采取特定的措施,如设置状态变量或调用其他的方法。
  *
  * 参数:
  * target - 处理指令目标。
  * data - 处理指令数据,如果未提供,则为 null。
  */
 
 public void ignorableWhitespace(char[] ch, int start, int length)
   throws SAXException {
  
  super.ignorableWhitespace(ch, start, length);
 }
 
 /*
  * (non-Javadoc)
  * @see org.xml.sax.helpers.DefaultHandler#notationDecl(java.lang.String, java.lang.String, java.lang.String)
  * 接收注释声明的通知。
  * 默认情况下,不执行任何操作。如果应用程序编写者希望跟踪在文档中声明的注释,
  * 则可以在子类中重写此方法
  *
  * 参数:
  * name - 注释名称。
  * publicId - 注释公共标识符,如果没有可使用的则为 null。
  * systemId - 注释系统标识符。
  */
 
 public void notationDecl(String name, String publicId, String systemId)
   throws SAXException {
  
  super.notationDecl(name, publicId, systemId);
 }

 /*
  * (non-Javadoc)
  * @see org.xml.sax.helpers.DefaultHandler#processingInstruction(java.lang.String, java.lang.String)
  *
  * 接收处理指令的通知
  * 默认情况下,不执行任何操作。应用程序编写者可以在子类中重写此方法,以便对每个
  * 处理指令采取特定的措施,如设置状态变量或调用其他的方法。
  *
  * 参数:
  * target - 处理指令目标。
  * data - 处理指令数据,如果未提供,则为 null。
  */
 
 public void processingInstruction(String target, String data)
   throws SAXException {
  
  super.processingInstruction(target, data);
 }

 /*
  * (non-Javadoc)
  * @see org.xml.sax.helpers.DefaultHandler#resolveEntity(java.lang.String, java.lang.String)
  * 解析外部实体。
  *
  * 将始终返回 null,因此解析器将使用 XML 文档中提供的系统标识符。此方法实现 SAX 默
  * 认的行为:应用程序编写者可以在子类中重写它以便进行诸如目录查找或 URI 重定向之类的特定转换。
  *
  * 参数:
  * publicId - 公共标识符,如果没有可用的,则为 null。
  * systemId - 在 XML 文档中提供的系统标识符。
  *
  * 返回:
  * 新的输入源,或返回 null,以要求默认的行为。
  */
 
 public InputSource resolveEntity(String publicId, String systemId)
   throws IOException, SAXException {
  
  return super.resolveEntity(publicId, systemId);
 }

 /*
  *  (non-Javadoc)
  * @see org.xml.sax.helpers.DefaultHandler#setDocumentLocator(org.xml.sax.Locator)
  * 接收文档事件的 Locator 对象。
  * 默认情况下,不执行任何操作。如果应用程序编写者希望存储定位器以用于其他的文档事件,
  * 则可以在子类中重写此方法。
  *
  * 参数:
  * locator - 用于所有 SAX 文档事件的定位器。
  */
 
 public void setDocumentLocator(Locator locator) {
  
  super.setDocumentLocator(locator);
 }

 /*
  * (non-Javadoc)
  * @see org.xml.sax.helpers.DefaultHandler#skippedEntity(java.lang.String)
  * 接收跳过的实体的通知。
  *
  * 默认情况下,不执行任何操作。应用程序编写者可以在子类中重写此方法,以便对每个处理指
  * 令采取特定的措施,如设置状态变量或调用其他的方法。
  * 参数:
  * name - 跳过的实体的名称。
  */
 
 public void skippedEntity(String name) throws SAXException {
  
  super.skippedEntity(name);
 }

 /*
  * (non-Javadoc)
  * @see org.xml.sax.helpers.DefaultHandler#startDocument()
  * 接收文档开始的通知。
  * 默认情况下,不执行任何操作。应用程序编写者可以在子类中重写此方法,以便在文档的开始采
  * 取特定的措施(如分配树的根节点或创建输出文件)。
  *
  */
 
 public void startDocument() throws SAXException {
  
  super.startDocument();
 }

 /*
  * (non-Javadoc)
  * @see org.xml.sax.helpers.DefaultHandler#startElement(java.lang.String, java.lang.String, java.lang.String, org.xml.sax.Attributes)
  * 接收元素开始的通知。
  * 默认情况下,不执行任何操作。应用程序编写者可以在子类中重写此方法,以便在每个元素的开始
  * 处采取特定的操作(如,分配新的树节点或将输出写入文件)。
  *
  * 参数:
  * uri - 名称空间 URI,如果元素没有任何名称空间 URI,或者没有正在执行名称空间处理,则为空字符串。
  * localName - 本地名称(不带前缀),如果没有正在执行名称空间处理,则为空字符串。
  * qName - 限定的名称(带有前缀),如果限定的名称不可用,则为空字符串。
  * attributes - 附加到元素的属性。如果没有属性,则它将是空的 Attributes 对象。
  */
 
 public void startElement(String uri, String localName, String qName,
   Attributes attributes) throws SAXException {
  
  super.startElement(uri, localName, qName, attributes);
 }

 /*
  * (non-Javadoc)
  * @see org.xml.sax.helpers.DefaultHandler#startPrefixMapping(java.lang.String, java.lang.String)
  * 接收名称空间映射开始的通知。
  * 默认情况下,不执行任何操作。应用程序编写者可以在子类中重写此方法,以便在每个名称空间前缀
  * 范围的开始处采取特定的操作(如存储前缀映射)。
  *
  * 参数:
  * prefix - 正在声明的名称空间前缀。
  * uri - 映射到前缀的名称空间 URI。
  */
 
 public void startPrefixMapping(String prefix, String uri)
   throws SAXException {
  
  super.startPrefixMapping(prefix, uri);
 }

 /*
  * (non-Javadoc)
  * @see org.xml.sax.helpers.DefaultHandler#unparsedEntityDecl(java.lang.String, java.lang.String, java.lang.String, java.lang.String)
  *
  * 接收未解析实体声明的通知。
  * 默认情况下,不执行任何操作。应用程序编写者可以在子类中重写此方法,以便跟踪在文档中声明的未
  * 解析实体。
  *
  * 参数:
  * name - 实体名称。
  * publicId - 实体公共标识符,如果不可用,则为 null。
  * systemId - 实体系统标识符。
  * notationName - 相关联的注释的名称。
  */
 
 public void unparsedEntityDecl(String name, String publicId,
   String systemId, String notationName) throws SAXException {
  
  super.unparsedEntityDecl(name, publicId, systemId, notationName);
 }

 /*
  * (non-Javadoc)
  * @see org.xml.sax.helpers.DefaultHandler#warning(org.xml.sax.SAXParseException)
  * 接收解析器警告的通知。
  *
  * 默认实现不执行任何操作。应用程序编写者可以在子类中重写此方法,以便对每个警告采取特定的措施,
  * 如在日志文件中插入消息,或者将它打印到控制台。
  *
  * 参数:
  * e - 被编码为异常的警告信息。
  */
 
 public void warning(SAXParseException e) throws SAXException {
  
  super.warning(e);
 }
 
}

这个类只把xml文件的信息读出来了

------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

结果:

activeWeb contentserver 跨站点脚本编制
基础结构测试
跨站点脚本编制
http://projects.webappsec.org/Cross-Site+Scripting
在返回给用户之前,activeWeb contentserver 不会适当清理传递给“msg”参数(rights.asp)的输入。
可将其开发,以在整个站点上安装“跨站点脚本编制”攻击。
利用的样本:
http://[SERVER]/errors/rights.asp?awReadAccessRight=True
&
msg=[XSS]
未安装第三方产品的最新补丁或最新修订程序
可能会窃取或操纵客户会话和 cookie,它们可能用于模仿合法用户,从而使黑客能够以该用户身份查看或变更用户记录以及执行事务
activeWeb contentserver(5.2964 以下的版本)
CVE-2007-3014
供应商站点
BugTraq BID: 24895
Secunia 咨询
升级至 activeWeb contentserver 的最新版本。
【文件解析完成!】
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

抱歉!评论已关闭.