当前位置: 首页 > news >正文

XML 解析异常问题解决

问题描述

The parser has encountered more than "64000" entity expansions in this document; this is the limit imposed by the JDK.
在运行 Java 应用程序时,出现了 XML 解析异常。具体表现为:

报错信息显示无法创建 StAX(Streaming API for XML)解析器,具体原因是超过了 JDK 默认的 64,000 个实体扩展限制。

以下是日志中的关键部分:


Exception in thread "Thread-6" com.sun.xml.internal.ws.streaming.XMLReaderException: Unable to create StAX reader or writerat com.sun.xml.internal.ws.api.streaming.XMLStreamReaderFactory.create(XMLStreamReaderFactory.java:359)...
Caused by: javax.xml.stream.XMLStreamException: Parser error at [row,col]:[1,1]
Message: JAXP00010004: The parser has encountered more than "64000" entity expansions in this document; this is the limit imposed by the JDK.at com.sun.org.apache.xerces.internal.impl.XMLStreamReaderImpl.next(XMLStreamReaderImpl.java:219)...

异常日志分析

Exception in thread "Thread-6" com.sun.xml.internal.ws.streaming.XMLReaderException: Unable to create StAX reader or writer
...
Caused by: javax.xml.stream.XMLStreamException: Parser error at [row,col]:[1,1]
Message: JAXP00010004: The parser has encountered more than "64000" entity expansions in this document; this is the limit imposed by the JDK.

这个异常信息表明,由于 XML 文档中的实体扩展数量超过了 JDK 的默认限制,导致无法创建 StAX 解析器。JDK(Java 开发工具包)为了防止 XML bomb 攻击,对实体扩展设置了默认限制(64,000 个)。

什么是实体扩展

在 XML 中,实体扩展(Entity Expansion)指的是对 XML 实体(Entities)的引用和替换。实体是 XML 中的一种构造,它允许在文档中定义和使用替代符号,以减少冗余或增强可读性。实体可以是字符实体、参数实体或外部实体。

实体扩展的示例

  1. 字符实体

    • 用于表示某些字符,例如:
      &lt; 表示 <
      &gt; 表示 >
      &amp; 表示 &
      
  2. 内部实体

    • 定义在文档内部的实体。例如:
      <!DOCTYPE example [<!ENTITY example "This is an example entity.">
      ]>
      <example>&example;</example>
      
    • 这里,&example; 是一个实体引用,在解析时会被替换为 This is an example entity.
  3. 外部实体

    • 引用外部资源的实体。例如:
      <!DOCTYPE example [<!ENTITY example SYSTEM "http://example.com/entity.txt">
      ]>
      <example>&example;</example>
      

安全性问题

实体扩展的机制在处理复杂和嵌套的实体引用时,可能会导致安全性问题。特别是,恶意用户可以创建大量嵌套的实体引用,导致解析器在处理时消耗大量资源,进而引发所谓的“XML bomb”攻击。例如:

<!DOCTYPE bomb [<!ENTITY a "aaaaa... (1万次) ...aaaaa"><!ENTITY b "&a;&a;&a;&a;&a;... (1万次) ...&a;"><!ENTITY c "&b;&b;&b;&b;&b;... (1万次) ...&b;">
]>
<bomb>&c;</bomb>

在这种情况下,解析器必须扩展所有这些实体引用,可能会消耗大量的内存和 CPU,导致拒绝服务(DoS)。

JDK 的限制

为了防止这种类型的攻击,JDK 在 XML 解析器中设置了实体扩展的默认限制。这个限制在当前版本中是 64,000 个实体扩展。如果文档中的实体扩展超过这个数量,解析器会抛出异常。

Java 代码层面的解决方法

调整实体扩展限制

为了解决实体扩展数量超限的问题,可以增加 JDK 的实体扩展限制:

  • 运行时设置系统属性

    java -DentityExpansionLimit=100000 -jar your-application.jar
    
  • 代码中设置系统属性

    public class Main {public static void main(String[] args) {System.setProperty("entityExpansionLimit", "100000");// 启动应用程序}
    }
    
http://www.lryc.cn/news/400657.html

相关文章:

  • C# 匿名方法、Lambda、Linq概念及联系
  • django ninja get not allowed 能用 put delete
  • 服务器操作集合
  • 论文阅读【时空+大模型】ST-LLM(MDM2024)
  • 【linux基础】linux远程传输三种免交互方式
  • MySQL篇:事务
  • 处理在 electron 中使用开启了懒加载的 el-image 后,窗口最大化或窗口尺寸变化后图片无法显示的问题
  • Electron 进程间通信
  • 0基础学python-8:if,while,for
  • 低空经济持续发热,无人机培训考证就业市场及前景剖析
  • [IDEA插件] JarEditor 编辑jar包(直接新增、修改、删除jar包内的class文件)
  • JavaScript系列:JS实现复制粘贴文字以及图片
  • 音视频入门基础:H.264专题(14)——计算视频帧率的公式
  • LeetCode-返回链表倒数第K个节点、链表的回文结构,相交链表
  • Linux 网络配置与连接
  • 5. 基于Embedding实现超越elasticsearch高级搜索
  • 探索Docker网络配置和管理
  • 【数据库】 mysql数据库管理工具 Navicat平替工具 免费开源数据库管理工具
  • 信息系统项目管理师(高项)—学习笔记二
  • 【Vue】 style中的scoped
  • maven项目容器化运行之2-maven中使用docker插件调用远程docker构建服务并在1Panel中运行
  • 电影购票小程序论文(设计)开题报告
  • IP风险画像 金融行业的安全盾牌
  • 探索老年综合评估实训室的功能与价值
  • 视频剪辑软件如何选?FCPX和PR更适合新手呢
  • 解决第三方模块ts声明文件编译错误问题
  • 数据结构小测试:排序算法
  • 电脑远程开关机
  • # Redis 入门到精通(四)-- linux 环境安装 redis
  • SQL进阶技巧:如何按照固定尺寸(固定区间)对数据进行打分类标签?