java web项目,如何检验XML中的参数是否合法,避免出现xxe漏洞?
3条回答 默认 最新
- arisfei1 2018-07-17 06:57关注
/**
* 解析xml,返回第一级元素键值对。如果第一级元素有子节点,则此节点的值是子节点的xml数据。
* @param strxml
* @return
* @throws JDOMException
* @throws IOException
/
public static Map doXMLParse(String strxml) throws JDOMException, IOException {
//过滤关键词,防止XXE漏洞攻击
strxml = XMLUtil.filterXXE(strxml);
//
strxml = strxml.replaceFirst("encoding=\".\"", "encoding=\"UTF-8\"");if(null == strxml || "".equals(strxml)) { return null; } Map m = new HashMap(); InputStream in = new ByteArrayInputStream(strxml.getBytes("UTF-8")); SAXBuilder builder = new SAXBuilder(); Document doc = builder.build(in); Element root = doc.getRootElement(); List list = root.getChildren(); Iterator it = list.iterator(); while(it.hasNext()) { Element e = (Element) it.next(); String k = e.getName(); String v = ""; List children = e.getChildren(); if(children.isEmpty()) { v = e.getTextNormalize(); } else { v = XMLUtil.getChildrenText(children); } m.put(k, v); } //关闭流 in.close(); return m; } /** * 防止 XXE漏洞 注入实体攻击 * 过滤 过滤用户提交的XML数据 * 过滤关键词:<!DOCTYPE和<!ENTITY,或者SYSTEM和PUBLIC。 */ public static String filterXXE(String xmlStr){ xmlStr = xmlStr.replace("DOCTYPE", "").replace("SYSTEM", "").replace("ENTITY", "").replace("PUBLIC", "");
return xmlStr;
}//*****************以下为测试 攻击代码***** 内部调试用**************************
// public static void main(String[] args) {
// String strxml = XMLUtil.readFileByLines("C:\text.xml");
// try {
// XMLUtil.doXMLParse(strxml);
// } catch (JDOMException e) {
// // TODO Auto-generated catch block
// e.printStackTrace();
// } catch (IOException e) {
// // TODO Auto-generated catch block
// e.printStackTrace();
// }// }
C:\text.xml 的文件内容如下:
<!DOCTYPE a[<!ENTITY b SYSTEM "c:\123.txt">]>
&b;
login
<![CDATA[SUCCESS]]>
<![CDATA[OK]]>
<![CDATA[wx8775cbf90e1544d5]]>
<![CDATA[1406957502]]>
<![CDATA[RyXFitfwAY0iqotC]]>
<![CDATA[B60953438AB16569220DC885E15F8E39]]>
<![CDATA[SUCCESS]]>
<![CDATA[wx05104307622483a7349606c80845112418]]>
<![CDATA[APP]]>解决 无用评论 打赏 举报
悬赏问题
- ¥15 #MATLAB仿真#车辆换道路径规划
- ¥15 java 操作 elasticsearch 8.1 实现 索引的重建
- ¥15 数据可视化Python
- ¥15 要给毕业设计添加扫码登录的功能!!有偿
- ¥15 kafka 分区副本增加会导致消息丢失或者不可用吗?
- ¥15 微信公众号自制会员卡没有收款渠道啊
- ¥15 stable diffusion
- ¥100 Jenkins自动化部署—悬赏100元
- ¥15 关于#python#的问题:求帮写python代码
- ¥20 MATLAB画图图形出现上下震荡的线条