回馈广大同行网友系列~~~~~~首先thanks for 网友们的无私分享,在抄完之后我献上我的解决整理
公司用内网,纯手打的
xml报文demo
<?xml version="1.0" encoding="UTF-8"?>
<ROOT>
<ITEM>
<XXXX></XXXX>
...
</ITEM>
<ITEM>
<XXXX></XXXX>
...
</ITEM>
</ROOT>
首先写一个XmlUtil工具类
import javax.xml.bind.JAXBContext;
import javax.xml.bind.Unmarshaller;
...
public class XmlUtil{
public static <T> T convertXmlStrToObject(Class<?> clazz,String xmlStr){
T xmlObject = null;
try{
JAXBContext context = JAXBContext.newInstance(clazz);
Unmarshaller unmarshaller = context.createUnmarshaller();
XMLInputFactory xif = XMLInputFactory.newFactory();
xif.setProperty(XMLInputFactory.IS_SUPPORTING_EXTERNAL_ENTITIES,false);
xif.setProperty(XMLInputFactory.SUPPORT_DTD,false);
XMLStreamReader xsr = xif.createXMLStreamReader(new StringReader(xmlStr));
xmlObject = (T) unmarshaller.unmarshal(new StringReader(xmlStr));
} catch (Exception e){
log.error("将报文转换为object失败:{}",e.getMessage());
}
return xmlObject;
}
}
对于XML外部实体注入(XXE)问题
摘要
使用配置的 XML 解析器无法预防和限制外部实体进行解析,这会使解析器暴露在 XML External Entities 攻击之下。
缺陷描述
XML External Entities 攻击可利用能够在处理时动态构建文档的 XML 功能。XML
实体可动态包含来自给定资源的数据。外部实体允许 XML 文档包含来自外部 URI
的数据。除非另行配置,否则外部实体会迫使 XML 解析器访问由 URI
指定的资源,例如位于本地计算机或远程系统上的某个文件。这一行为会将应用程序暴露给 XML External Entity (XXE)
攻击,从而用于拒绝本地系统的服务,获取对本地计算机上文件未经授权的访问权限,扫描远程计算机,并拒绝远程系统的服务。
修复建议:
• 避免在可能的情况下直接处理用户输入。
• 如果需要从用户接收XML,则确保XML解析器受到限制和约束。
特别是禁用DTD解析和实体解析。在服务器上应用严格的xml架构,然后对输入的xml进行相应的验证
• 使用安全的XML解析器,并禁用DTD解析和实体解析。
• 不启用DTD解析或实体解析
你需要转化的类
@Data
@XmlRootElement(name = "ROOT")
public class XXXRoot{
private List<XXX> ITEM;
}
ITEM对应了 < ITEM > 标签,如果要起别名可以试试@XmlElement(name = “ITEM”)我没试过,具体效果自己看吧
@XmlAccessorType(XmlAccessType.FIELD)
@Data
public class XXX implements Serializable{
@XmlElement(name="yyy")
private String yy;
.....
}
使用的时候,XXXRoot ddd = XmlUtil.convertXmlStrToObject(XXXRoot.class,xmlbaowenstring);