java xml与实体之间的转换(附有XXE漏洞解决方案)

📢博客主页:折戏花

📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正!

📢本文由折戏花编写,首发于CSDN🙉

平时开发与第三方对接的时候往往会涉及到xml格式的处理,小编这里就记录一下用到的javaBean与xml之间的相互转换

利用JAXB技术实现xml与实体之间的相互转换

1、JAXB介绍

JAXB能够使用Jackson对JAXB注解的支持实现(jackson-module-jaxb-annotations),既方便生成XML,也方便生成JSON,这样一来可以更好的标志可以转换为JSON对象的JAVA类。JAXB允许JAVA人员将JAVA类映射为XML表示方式,常用的注解包括:@XmlRootElement,@XmlElement等等

2、注解

@XmlRootElement注解用于指定类的XML根元素的名称。通过在类上添加该注解,可以将该类映射为XML文档的根元素。使用该注解可以指定根元素的名称,并且可以与其他注解(如@XmlType、@XmlAccessorType、@XmlAccessorOrder等)一起使用

@XmlRootElement(name = "MyRootElement")
public class MyClass {
    // 类的成员变量和方法
}

@XmlAccessorType用于指定类中属性的访问方式。它有以下几个选项:

XmlAccessType.FIELD:表示使用字段访问方式,即直接访问类中的字段。这是默认的访问方式。

XmlAccessType.PROPERTY:表示使用属性访问方式,即通过getter和setter方法访问类中的属性。

XmlAccessType.PUBLIC_MEMBER:表示使用公共成员访问方式,即通过公共字段和公共getter和setter方法访问类中的属性。

XmlAccessType.NONE:表示不使用任何访问方式,即不访问类中的属性。

@XmlAccessorType(XmlAccessType.FIELD)
public class MyClass {
}

@XmlAttribute将JavaBean属性映射到XML属性,通过使用name属性,可以指定该元素在生成的XML中的属性名称

@XmlRootElement(name = "OBJECT")
@XmlAccessorType(XmlAccessType.FIELD)
public class MyClass{
    @XmlAttribute(name = "TYPE")
    private String type;
}

@XmlElement用于在使用JAXB或其他XML绑定技术时,控制Java类与XML数据之间的映射关系,通过使用name属性,可以指定该元素在生成的XML中的名称

@XmlRootElement(name = "Response")
@XmlAccessorType(XmlAccessType.FIELD)
public class MyClass{
    @XmlElement(name = "TYPE")
     private String type;;

}

3、使用示例

工具类

import lombok.extern.slf4j.Slf4j;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;
import java.io.IOException;
import java.io.StringReader;
import java.io.StringWriter;

@Slf4j
public class XmlUtil {

    public static String beanToXml(Object obj, Class<?> load) {
        String xmlStr = null;
        try {
            JAXBContext context = JAXBContext.newInstance(load);
            Marshaller marshaller = context.createMarshaller();
            // 去掉生成xml的默认报文头
            marshaller.setProperty(Marshaller.JAXB_FRAGMENT, true);
            StringWriter writer = new StringWriter();
            marshaller.marshal(obj, writer);
            xmlStr = writer.toString();
        } catch (JAXBException e) {
            log.error("实体转为xml时出错!", e);
        }
        return xmlStr;
    }

    public static Object xmlToBean(String str, Class<?> load) {
        Object object = null;
        try {
            JAXBContext context = JAXBContext.newInstance(load);
            Unmarshaller unmarshaller = context.createUnmarshaller();
            object = unmarshaller.unmarshal(new StringReader(str));
        } catch (JAXBException e) {
            log.error("xml转换到实体时出错,xml信息={},报错信息={}!", str, e);
        }
        return object;
    }
}

实体定义及执行结果展示
@XmlAttribute

@Data
@XmlRootElement(name = "OBJECT")
@XmlAccessorType(XmlAccessType.FIELD)
public class Test {

    @XmlAttribute(name = "ID")
    private String id;
    
    @XmlAttribute(name = "TYPE")
    private String type;
    
}
  public static void main(String[] args) {
        Test test = new Test();
        test.setId("1");
        test.setType("类型");
        String xml = XmlUtil.beanToXml(test,Test.class);
        System.out.println(xml);
        Test newTest = (Test) XmlUtil.xmlToBean(xml,Test.class);
        System.out.println(newTest);
    }

在这里插入图片描述

@XmlElement

@Data
@XmlRootElement(name = "OBJECT")
@XmlAccessorType(XmlAccessType.FIELD)
public class Test {

    @XmlElement(name = "ID")
    private String id;

    @XmlElement(name = "TYPE")
    private String type;

}

public static void main(String[] args) {
        Test test = new Test();
        test.setId("1");
        test.setType("类型");
        String xml = XmlUtil.beanToXml(test,Test.class);
        System.out.println(xml);
        Test newTest = (Test) XmlUtil.xmlToBean(xml,Test.class);
        System.out.println(newTest);
    }

在这里插入图片描述

4、外部实体注入漏洞解决

XML外部实体注入漏洞,即XXE(XML External Entity),此漏洞发生在应用程序解析XML输入时,没有禁止外部实体的加载,导致可加载恶意外部文件,造成文件读取、命令执行、内网端口扫描、攻击内网网站、发起dos攻击等危害

将XMLInputFactory.SUPPORT_DTD 和XMLInputFactory.IS_SUPPORTING_EXTERNAL_ENTITIES设置为false,禁止DTD


    public static Object xmlToBean(String str, Class<?> load) {
        Object object = null;
        try {
            JAXBContext context = JAXBContext.newInstance(load);
            Unmarshaller unmarshaller = context.createUnmarshaller();
            XMLInputFactory xmlInputFactory = XMLInputFactory.newFactory();
            //禁止DTD,防止XXE漏洞
            xmlInputFactory.setProperty(XMLInputFactory.SUPPORT_DTD, false);
            xmlInputFactory.setProperty(XMLInputFactory.IS_SUPPORTING_EXTERNAL_ENTITIES, false);
            final XMLStreamReader xmlStreamReader = xmlInputFactory
                    .createXMLStreamReader(new StringReader(str));
            object = unmarshaller.unmarshal(xmlStreamReader);
        } catch (JAXBException | XMLStreamException e) {
            log.error("xml转换到实体时出错,xml信息={},报错信息={}!", str, e);
        }
        return object;
    }
  • 41
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
XML实体执行命令漏洞XML External Entity,简称XXE),是指在XML文档的解析过程中,利用实体注入技术来执行恶意命令的一种攻击方式。对于该问题,以下是一个用300字中文回答: XML实体执行命令java xxe是一种漏洞攻击方式。当解析XML时,攻击者通过在XML文档中注入带有恶意代码的实体,可以导致服务器执行恶意命令或读取敏感数据。 在Java中,XXE漏洞可以通过DocumentBuilderFactory解析XML时使用的解析器特性(如“<!DOCTYPE”、“DOCTYPE”和“<ENTITY>”等)来注入实体。攻击者可以构造恶意的XML文档,通过实体注入技术注入包含恶意代码的外部资源引用。当XML文档被解析时,解析器会尝试从外部资源加载实体,如果攻击者在外部资源中包含了一些系统命令,那么这些命令就会被执行。 为防止XXE漏洞,应对输入进行合理过滤和安全处理。可采取以下几种防护措施:1.禁止或限制解析器使用外部实体和外部DTD文件。2.使用安全的解析器,如Woodstox、SAX、SAXON等,它们可以禁用外部实体和DTD。3.对输入进行严格的验证和过滤,确保只接受合法的XML数据。4.采用白名单机制,限制允许的XML元素、属性和实体。 总之,通过对输入进行严格验证和过滤,禁用或限制外部实体和DTD,选择安全的解析器等措施,可以有效防范XML实体执行命令java xxe漏洞带来的危害。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

折戏花

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值