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 中的一种构造,它允许在文档中定义和使用替代符号,以减少冗余或增强可读性。实体可以是字符实体、参数实体或外部实体。
实体扩展的示例
-
字符实体:
- 用于表示某些字符,例如:
< 表示 < > 表示 > & 表示 &
- 用于表示某些字符,例如:
-
内部实体:
- 定义在文档内部的实体。例如:
<!DOCTYPE example [<!ENTITY example "This is an example entity."> ]> <example>&example;</example>
- 这里,
&example;
是一个实体引用,在解析时会被替换为This is an example entity.
。
- 定义在文档内部的实体。例如:
-
外部实体:
- 引用外部资源的实体。例如:
<!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");// 启动应用程序} }
相关文章:

XML 解析异常问题解决
问题描述 The parser has encountered more than "64000" entity expansions in this document; this is the limit imposed by the JDK. 在运行 Java 应用程序时,出现了 XML 解析异常。具体表现为: 报错信息显示无法创建 StAX(S…...

C# 匿名方法、Lambda、Linq概念及联系
匿名方法、Lambda表达式与LINQ 匿名方法 概念: 匿名方法是没有名称的方法实现,通常与委托关联使用。它提供了一种在不创建独立命名方法的情况下编写代码块的方式。 语法: delegate void MyDelegate(string message);MyDelegate del dele…...

django ninja get not allowed 能用 put delete
遇到一个奇怪的问题,django-ninja 编写的 get post 方法不能使用 # 获取Material router.get(/material, responseList[MaterialSchemaOut]) paginate(MyPagination) def list_material(request, filters: Filters Query(...)):qs retrieve(request, Material, f…...

服务器操作集合
服务器使用PC作为代理访问外网 1、PC上启动代理,比如nginx 下载nginx:http://nginx.org/en/download.html 修改配置文件,在conf下: http {include mime.types;default_type application/octet-stream;sendfile o…...

论文阅读【时空+大模型】ST-LLM(MDM2024)
论文阅读【时空大模型】ST-LLM(MDM2024) 论文链接:Spatial-Temporal Large Language Model for Traffic Prediction 代码仓库:https://github.com/ChenxiLiu-HNU/ST-LLM 发表于MDM2024(Mobile Data Management…...

【linux基础】linux远程传输三种免交互方式
linux远程传输三种免交互方式 文章目录 linux远程传输三种免交互方式1、使用sshpass工具2、使用expect脚本来输入密码3、SSH 密钥对 1、使用sshpass工具 建立信任关系的做法是最方便和安全的做法,但是在有些场景下(比如远端的authorized_keys是不能随意更改的)&…...

MySQL篇:事务
1.四大特性 首先,事务的四大特性:ACID(原子性,一致性,隔离性,持久性) 在InnoDB引擎中,是怎么来保证这四个特性的呢? 持久性是通过 redo log (重做日志&…...

处理在 electron 中使用开启了懒加载的 el-image 后,窗口最大化或窗口尺寸变化后图片无法显示的问题
文章目录 1、问题描述2、详情动图3、解决思路4、解决方案5、效果展示 1、问题描述 在 electron 中使用 el-image 时,开启了懒加载后,发现只有当窗口滚动后,图片才会显示,即便图片已经处于窗口的可视区域。当拖动窗口使其尺寸变大…...

Electron 进程间通信
文章目录 渲染进程到主进程(单向)渲染进程到主进程(双向)主进程到渲染进程 (单向,可模拟双向) 渲染进程到主进程(单向) send (render 发送)on &a…...

0基础学python-8:if,while,for
目录 前言: 一、选择循环结构 1.if条件语句 2.while 3.for循环 4.break语句 5.continue语句 前言: if、while 和 for 是 Python 中常用的控制流结构,它们分别用于条件判断、循环执行和迭代遍历。这些关键字帮助程序根据条件和数据进行选…...

低空经济持续发热,无人机培训考证就业市场及前景剖析
随着科技的不断进步和社会需求的日益增长,低空经济已成为全球及我国经济增长的新引擎。作为低空经济的重要组成部分,无人机技术因其广泛的应用领域和显著的经济效益,受到了社会各界的广泛关注。为满足市场对无人机人才的需求,无人…...

[IDEA插件] JarEditor 编辑jar包(直接新增、修改、删除jar包内的class文件)
文章目录 1. 安装插件 JarEditor2. 在IDEA中添加外部JAR包3. JarEditor 使用介绍 之前我们需要修改jar内文件的时候需要解压jar包,反编译class,新建java源文件,修改代码,再编译成class,替换jar包内的class文件。 现在…...

JavaScript系列:JS实现复制粘贴文字以及图片
文章目录 一. 基于 Clipboard API 复制文字(推荐)基本概念主要方法使用限制实际应用示例 二、基于 document.execCommand(copy)缺陷实际应用示例说明 三、复制图片功能四、封装 一. 基于 Clipboard API 复制文字(推荐) 基本概念 …...

音视频入门基础:H.264专题(14)——计算视频帧率的公式
一、引言 通过FFmpeg命令可以获取到H.264裸流文件的视频帧率: 在vlc中也可以获取到视频帧率(vlc底层也使用了FFmpeg进行解码): 所以FFmpeg和vlc是怎样获取到H.264编码的视频的帧率呢?它们其实是通过SPS中的VUI parame…...

LeetCode-返回链表倒数第K个节点、链表的回文结构,相交链表
一、返回链表倒数第k个节点 . - 力扣(LeetCode) 本体思路参展寻找中间节点的方法,寻找中间节点是定义快慢指针,快指针每次走两步,慢指针每次走一步,当快指针为空或者快指针的下一个节点是空时,…...

Linux 网络配置与连接
一、网络配置 1.1 ifconfig 网卡配置查询 ifconfig #查看所有启动的网络接口信息 ifconfig 指定的网卡 #查看指定网络接口信息 1.2 修改网络配置文件 vim /etc/sysconfig/network-scripts/ifcfg-ens33 #ens33网络配置文…...

5. 基于Embedding实现超越elasticsearch高级搜索
Embedding介绍 Embedding是向量的意思,向量可以理解为平面坐标中的一个坐标点(x,y),在编程领域,一个二维向量就是一个大小为float类型的数组。也可以用三维坐标系中的向量表示一个空间中的点。在机器学习中,向量通常用于表示数据的特征。 向量…...

探索Docker网络配置和管理
目录 1.docker网络类型有几种? 2.自定义网络管理 1.查看网络信息 2.查看网络的详细信息 3.创建四种网络容器 3.none类型 1.验证 4.host类型 1.验证 5. bridge类型 1.验证 2.设备对 6. container类型 1.验证 2.详解 7.科普下docker的网络名称空间 “…...

【数据库】 mysql数据库管理工具 Navicat平替工具 免费开源数据库管理工具
一、数据库分享 本次分享针对mysql的数据库管理工具 全部为开源免费工具 1、beekeeper-studio 可以从github或者官方下载 1.1、官方网址 官方地址:https://www.beekeeperstudio.io/ 1.2、Github 网址 Github地址:https://github.com/beekeeper-studio…...

信息系统项目管理师(高项)—学习笔记二
第一章 以下是上一篇(信息系统项目管理师(高项)—学习笔记)的续写,因为是之前记录的,这一篇还是细致到每一个小节的内容,有些过于复杂了,后续会简化~ 1.3 现代化创新发展 党的十九…...

【Vue】 style中的scoped
一、什么是scoped,为什么要用 在vue文件中的style标签上,有一个特殊的属性:scoped。 当一个style标签拥有scoped属性时,它的CSS样式就只能作用于当前的组件,通过该属性,可以使得组件之间的样式不互相污染…...

maven项目容器化运行之2-maven中使用docker插件调用远程docker构建服务并在1Panel中运行
一.背景 公司主机管理小组的同事期望我们开发的maven项目能够在1Panel管理的docker容器部署。上一篇写了先开放1Panel中docker镜像构建能力maven项目容器化运行之1-基于1Panel软件将docker镜像构建能力分享给局域网-CSDN博客。这一篇就是演示maven工程的镜像构建、容器运行、运…...

电影购票小程序论文(设计)开题报告
一、课题的背景和意义 随着互联网技术的不断发展,人们对于购票的需求也越来越高。传统的购票方式存在着排队时间长、购票流程繁琐等问题,而网上购票则能够有效地解决这些问题。电影购票小程序是网上购票的一种新型应用,它能够让用户随时随地…...

IP风险画像 金融行业的安全盾牌
在当今数字化时代,金融行业面临着前所未有的安全挑战。随着在线交易和数字银行业务的迅猛发展,欺诈和网络攻击的威胁也在不断增加。金融机构需要高效、可靠的安全解决方案来保护客户的资产和个人信息,防止各种形式的欺诈行为。 IP风险画像是…...

探索老年综合评估实训室的功能与价值
一、引言 随着人口老龄化的加剧,老年健康问题日益受到关注。老年综合评估实训室作为专门为老年人健康服务而设立的场所,具有独特的功能和重要的价值。 二、老年综合评估实训室的功能 (一)健康评估功能 1、身体功能评估 通过专业设…...

视频剪辑软件如何选?FCPX和PR更适合新手呢
随着抖音、快手等短视频平台的迅速兴起,短视频数量急剧增加。想要发布一款简单、高质量的短视频,运用剪辑软件至关重要。目前比较流行的有Adobe家的Premiere,以及Final Cut Pro X,经常有用户在二者间,不知如何选择&…...

解决第三方模块ts声明文件编译错误问题
最近小卷在用vite脚手架学习vue组件开发,使用的语言框架是typescript。在搭建vitepress在线文档服务时,用到了vitepress-demo-preview模块来展示vue组件示例和源代码。 发现import相关依赖时,会有这样的编译错误: 也就是没找到第…...

数据结构小测试:排序算法
目录 1、请简述数据结构八大排序算法的思路。 2、常用排序算法手写 冒泡排序: 选择排序: 快速排序: 归并排序: 堆排序: 3、额外再加一个二分查找吧 1、请简述数据结构八大排序算法的思路。 冒泡排序ÿ…...

电脑远程开关机
1. 远程开机 参考:https://post.smzdm.com/p/664774/ 1.1 Wake On LAN - 局域网唤醒(需要主板支持,一般都支持) 要使用远程唤醒,有几种方式:使用类似向日葵开机棒(很贵)、公网ip&…...

# Redis 入门到精通(四)-- linux 环境安装 redis
Redis 入门到精通(四)-- linux 环境安装 redis 一、linux 环境安装 redis – 基于 Linux 安装 redis 1、基于 Center 0S7 或者 unbunt-18.04 安装 Redis 1)下载安装包wget http://download.redis.io/releases/redis-?.?.?.tar.gz 如&…...