qq_37278595 2018-07-17 06:46 采纳率: 42.9%
浏览 2323
已结题

java web项目,如何过滤xml 非法字符,避免出现xxe漏洞?

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画图图形出现上下震荡的线条