SAX解析XML

1 篇文章 0 订阅

要解析的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 的最新版本。
【文件解析完成!】
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
SAX解析是一种基于事件驱动的XML解析方法。它通过逐行读取XML文档并触发相应的事件来解析XML数据。在SAX解析中,有三个核心步骤: 1. 获取XML解析器:可以通过Java原生API获取XML解析器。使用`javax.xml.parsers.SAXParserFactory`类获取解析器的实例,然后使用`factory.newSAXParser()`方法获取`SAXParser`对象,最后通过`saxParser.getXMLReader()`方法获取`XMLReader`对象。 2. 注册自定义解析器:在SAX解析中,需要注册一个自定义的事件处理器来处理解析过程中的事件。可以创建一个继承自`DefaultHandler`类的自定义解析器,并重写`startElement`、`endElement`和`characters`等方法来处理开始节点、结束节点和节点内容等事件。 3. 解析XML:通过调用`xmlReader.parse()`方法来解析XML文档。可以传递XML文档的输入流或文件路径作为参数。解析过程中,SAX解析器会将读取到的XML解析成事件,并传递给注册的自定义解析器进行处理。 以下是一个使用SAX解析解析XML的示例代码: ```java public class SaxReader { public static XMLReader getInstance() throws Exception { SAXParserFactory factory = SAXParserFactory.newInstance(); SAXParser saxParser = factory.newSAXParser(); XMLReader xmlReader = saxParser.getXMLReader(); return xmlReader; } public static void main(String\[\] args) throws Exception { XMLReader xmlReader = getInstance(); MyHandler myHandler = new MyHandler(); xmlReader.setContentHandler(myHandler); xmlReader.parse(SaxReader.class.getClassLoader().getResource("Book.xml").getFile()); List<Book> bookList = myHandler.getBookList(); System.out.println(bookList); } } ``` 在上述代码中,`MyHandler`是自定义的事件处理器,`xmlReader.setContentHandler(myHandler)`用于注册自定义解析器。`xmlReader.parse()`方法用于解析XML文档,其中`SaxReader.class.getClassLoader().getResource("Book.xml").getFile()`用于获取XML文件的路径。解析结果可以通过自定义解析器的方法获取。 希望以上信息对您有所帮助。 #### 引用[.reference_title] - *1* *2* [sax解析xml详解](https://blog.csdn.net/qq_41063182/article/details/103689891)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [SAX解析和生成XML文档](https://blog.csdn.net/weixin_32576389/article/details/114825517)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值